1signature Streams =
2sig
3   datatype 'a stream = Stream of 'a * (unit -> 'a stream)
4   exception end_of_stream
5   val empty_stream : unit -> 'a stream
6   val stream_map : ('a -> 'b) -> (unit -> 'a stream) -> (unit -> 'b stream)
7   val stream_append : (unit -> 'a stream) ->
8                       (unit -> 'a stream) ->
9                       (unit -> 'a stream)
10   val stream_append_list : (unit -> 'a stream) list -> (unit -> 'a stream)
11   val stream_flat : (unit -> (unit -> 'a stream) stream) -> unit -> 'a stream
12   val permutations : 'a list -> unit -> 'a list stream
13end
14