struct
type ('a, 'b) t = {
result: 'a;
more_things_todo: 'b list;
}
let return ?(more_things_todo=[]) result = {result; more_things_todo}
let bind m ~f =
let next = f m.result in
{ next with more_things_todo = next.more_things_todo @ m.more_things_todo}
let (>>=) m f = bind m ~f
end