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