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.

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