type 'a enumerator = unit -> 'a option type 'a observer = 'a option -> unit fun list_enumerator xs = let val cell = ref xs in (fn () => if !cell = [] then NONE else let val v = !cell in cell := tl v; SOME (hd v) end) end fun dump_enumerator e = let fun loop NONE = () | loop (SOME a) = (print (Int.toString a); print "\n"; loop (e ())) in loop (e ()) end ; dump_enumerator (list_enumerator [1, 2, 3])