Module ByteListReader : READER.
Definition t (A : Type) := list byte -> option (A * list byte).
Definition unwrap {A} (x : t A) := x.
Definition getByte (l : list byte) :=
match l with
| [] => None
| b :: l => Some (b, l)
end.
Definition ret {A} (a : A) : t A := fun s => Some (a, s).
Definition bind {A B} (m : t A) (f : A -> t B) : t B :=
fun s => match m s with None => None
| Some (a, s') => f a s'
end.
Definition map {A B} (f : A -> B) (d : t A) : t B :=
bind d (fun a => ret (f a)).
Definition error {A} : t A :=
fun l => None.
Fixpoint fold {S A}
(f : byte -> S -> fold_state S A) (s : S) (l : list byte) :=
match l with
| [] => None
| b :: l => match f b s with
| Done a => Some (a, l)
| More s => fold f s l
| Error => None
end
end.

Lemma ret_unwrap : forall {A} (x: A) bytes, unwrap (ret x) bytes = Some (x, bytes).