Section IO_events.
Context {file_id : Type}.
Inductive IO_event : Type -> Type :=
| ERead (f : file_id) : IO_event byte
| EWrite (f : file_id) (c : byte) : IO_event unit.
Context {E : Type -> Type} `{IO_event -< E}.
Definition read f : itree E byte := embed (ERead f).
Definition write f (c : byte) : itree E unit := embed (EWrite f c).
Definition IO_itree := itree E unit.
(* We need a layer of inclusion to allow us to use the monad laws. *)
Definition ITREE (tr : IO_itree) := EX tr' : _, !!(sutt eq tr tr') &&
has_ext tr'.
(* this should be in ITrees *)
Global Instance Reflexive_sutt {E R} : RelationClasses.Reflexive (@sutt E R R eq).

Lemma ITREE_ext : forall tr tr', eutt eq tr tr' ->
ITREE tr = ITREE tr'.