## `stream`: operations on streams

    type 'a stream

  The type of streams containing values of type `'a`.

    exception Parse_failure

  Raised by parsers when none of the first component of the stream patterns is accepted

    exception Parse_error

  Raised by parsers when the first component of a stream pattern is accepted, but one of the following components is rejected

    value stream_next : 'a stream -> 'a

  `stream_next s` returns the first element of stream `s`, and removes it from the stream. Raise `Parse_failure` if the stream is empty.

    value stream_from : (unit -> 'a) -> 'a stream

  `stream_from f` returns the stream which fetches its terminals using the function `f`. This function could be defined as:
  `let rec stream_from f = [< 'f(); stream_from f >]`
  but is implemented more efficiently.

    value stream_of_string : string -> char stream

  `stream_of_string s` returns the stream of the characters in string `s`.

    value stream_of_channel : in_channel -> char stream

  `stream_of_channel ic` returns the stream of characters read on channel `ic`.

    value do_stream : ('a -> unit) -> 'a stream -> unit

  `do_stream f s` scans the whole stream `s`, applying the function `f` in turn to each terminal encountered

    value stream_check : ('a -> bool) -> 'a stream -> 'a

  `stream_check p` returns the parser which returns the first terminal of the stream if the predicate `p` returns `true` on this terminal, and raises `Parse_failure` otherwise.

    value end_of_stream : 'a stream -> unit

  Return `()` iff the stream is empty, and raise `Parse_failure` otherwise.

    value stream_get : 'a stream -> 'a * 'a stream

  `stream_get s` return the first element of the stream `s`, and a stream containing the remaining elements of `s`. Raise `Parse_failure` if the stream is empty. The stream `s` is not modified. This function makes it possible to access a stream non-destructively.