sig
  module type ELEM =
    sig
      type 'a elem
      type initial
      val reader :
        unit ->
        Pervasives.in_channel -> AnyShtream.ELEM.initial AnyShtream.ELEM.elem
      val of_string :
        unit -> string -> AnyShtream.ELEM.initial AnyShtream.ELEM.elem
      val string_of : unit -> 'AnyShtream.ELEM.elem -> string
    end
  module type S =
    sig
      type 'a t = 'Shtream.t
      type 'a co_t = 'Shtream.co_t
      exception Failure
      exception CoFailure
      val from : (int -> 'a option) -> 'a t
      val close : 'a t -> unit
      val of_list : 'a list -> 'a t
      val list_of : 'a t -> 'a list
      val of_stream : 'Stream.t -> 'a t
      val stream_of : 'a t -> 'Stream.t
      val npeek : ?n:int -> 'a t -> 'a list
      val peek : ?n:int -> 'a t -> 'a option
      val empty : 'a t -> unit
      val is_empty : 'a t -> bool
      val status : 'a t -> Proc.status option
      val junk : ?n:int -> 'a t -> unit
      val next : 'a t -> 'a
      val next' : 'a t -> 'a option
      val iter : ('-> unit) -> 'a t -> unit
      val filter : ('-> bool) -> 'a t -> 'a t
      val map : ('-> 'b) -> 'a t -> 'b t
      val concat_map : ('-> 'b list) -> 'a t -> 'b t
      val fold_left : ('-> '-> 'b) -> '-> 'a t -> 'b
      val fold_right : ('-> 'Lazy.t -> 'b) -> 'a t -> '-> 'b
      val nil : unit -> 'a t
      val insert : '-> 'a t -> unit
      val cons : '-> 'a t -> 'a t
      val append : 'a t -> 'a t -> 'a t
      val try_again : unit -> 'a
      val warn : ('a, unit, string, 'b) format4 -> 'a
      val fail_with : Proc.status -> 'a
      type error_handler = [ `Exception of exn | `Warning of string ] -> unit
      val current_error_handler : error_handler ref
      val ignore_errors : error_handler
      val warn_on_errors : error_handler
      val die_on_errors : error_handler
      val die_silently_on_errors : error_handler
      val coshtream_of : ?procref:Channel.procref -> ('a t -> 'b) -> 'a co_t
      val conil : unit -> 'a co_t
      val conext : 'a co_t -> '-> unit
      val coclose : 'a co_t -> unit
      val annihilate : 'a t -> 'a co_t -> unit
      val from_low : ?close:(unit -> unit) -> (int -> 'a) -> 'a t
      val claim : 'a t -> 'a t
      val set_reader : 'a t -> (in_channel -> 'a) -> unit
      val hint_reader : 'a t -> Reader.t -> unit
      type protector = Util.protector
      val add_protection : protector -> 'a t -> unit
      val add_cleanup : (unit -> unit) -> 'a t -> unit
      module Elem : ELEM
      type 'a elem = 'Elem.elem
      type initial = Elem.initial
      val elem_reader :
        Reader.t ->
        Pervasives.in_channel -> AnyShtream.S.initial AnyShtream.S.elem
      val output :
        ?channel:Pervasives.out_channel ->
        ?init:('AnyShtream.S.elem -> string) ->
        ?term:('AnyShtream.S.elem -> string) ->
        ?show:('AnyShtream.S.elem -> string) ->
        'AnyShtream.S.elem t -> unit
      val channel_of :
        ?procref:Channel.procref ->
        ?before:(unit -> unit) ->
        ?after:(unit -> unit) ->
        ?init:('AnyShtream.S.elem -> string) ->
        ?term:('AnyShtream.S.elem -> string) ->
        ?show:('AnyShtream.S.elem -> string) ->
        'AnyShtream.S.elem t -> Pervasives.in_channel
      val string_list_of :
        ?show:('AnyShtream.S.elem -> string) ->
        'AnyShtream.S.elem t -> string list
      val string_stream_of :
        ?show:('AnyShtream.S.elem -> string) ->
        'AnyShtream.S.elem t -> string Stream.t
      val of_channel :
        ?reader:(Pervasives.in_channel ->
                 AnyShtream.S.initial AnyShtream.S.elem) ->
        Pervasives.in_channel -> AnyShtream.S.initial AnyShtream.S.elem t
      val of_file :
        ?reader:(Pervasives.in_channel ->
                 AnyShtream.S.initial AnyShtream.S.elem) ->
        string -> AnyShtream.S.initial AnyShtream.S.elem t
      val of_command :
        ?procref:Channel.procref ->
        ?dups:Channel.dup_spec ->
        ?reader:(Pervasives.in_channel ->
                 AnyShtream.S.initial AnyShtream.S.elem) ->
        string -> AnyShtream.S.initial AnyShtream.S.elem t
      val of_program :
        ?procref:Channel.procref ->
        ?dups:Channel.dup_spec ->
        ?reader:(Pervasives.in_channel ->
                 AnyShtream.S.initial AnyShtream.S.elem) ->
        ?path:bool ->
        string ->
        ?argv0:string ->
        string list -> AnyShtream.S.initial AnyShtream.S.elem t
      val of_thunk :
        ?procref:Channel.procref ->
        ?dups:Channel.dup_spec ->
        ?reader:(Pervasives.in_channel ->
                 AnyShtream.S.initial AnyShtream.S.elem) ->
        (unit -> unit) -> AnyShtream.S.initial AnyShtream.S.elem t
      val of_string_list :
        ?parse:(string -> AnyShtream.S.initial AnyShtream.S.elem) ->
        string list -> AnyShtream.S.initial AnyShtream.S.elem t
      val of_string_stream :
        ?parse:(string -> AnyShtream.S.initial AnyShtream.S.elem) ->
        string Stream.t -> AnyShtream.S.initial AnyShtream.S.elem t
    end
  module Make :
    functor (E : ELEM->
      sig
        type 'a t = 'Shtream.t
        type 'a co_t = 'Shtream.co_t
        exception Failure
        exception CoFailure
        val from : (int -> 'a option) -> 'a t
        val close : 'a t -> unit
        val of_list : 'a list -> 'a t
        val list_of : 'a t -> 'a list
        val of_stream : 'Stream.t -> 'a t
        val stream_of : 'a t -> 'Stream.t
        val npeek : ?n:int -> 'a t -> 'a list
        val peek : ?n:int -> 'a t -> 'a option
        val empty : 'a t -> unit
        val is_empty : 'a t -> bool
        val status : 'a t -> Proc.status option
        val junk : ?n:int -> 'a t -> unit
        val next : 'a t -> 'a
        val next' : 'a t -> 'a option
        val iter : ('-> unit) -> 'a t -> unit
        val filter : ('-> bool) -> 'a t -> 'a t
        val map : ('-> 'b) -> 'a t -> 'b t
        val concat_map : ('-> 'b list) -> 'a t -> 'b t
        val fold_left : ('-> '-> 'b) -> '-> 'a t -> 'b
        val fold_right : ('-> 'Lazy.t -> 'b) -> 'a t -> '-> 'b
        val nil : unit -> 'a t
        val insert : '-> 'a t -> unit
        val cons : '-> 'a t -> 'a t
        val append : 'a t -> 'a t -> 'a t
        val try_again : unit -> 'a
        val warn : ('a, unit, string, 'b) format4 -> 'a
        val fail_with : Proc.status -> 'a
        type error_handler =
            [ `Exception of exn | `Warning of string ] -> unit
        val current_error_handler : error_handler ref
        val ignore_errors : error_handler
        val warn_on_errors : error_handler
        val die_on_errors : error_handler
        val die_silently_on_errors : error_handler
        val coshtream_of :
          ?procref:Channel.procref -> ('a t -> 'b) -> 'a co_t
        val conil : unit -> 'a co_t
        val conext : 'a co_t -> '-> unit
        val coclose : 'a co_t -> unit
        val annihilate : 'a t -> 'a co_t -> unit
        val from_low : ?close:(unit -> unit) -> (int -> 'a) -> 'a t
        val claim : 'a t -> 'a t
        val set_reader : 'a t -> (in_channel -> 'a) -> unit
        val hint_reader : 'a t -> Reader.t -> unit
        type protector = Util.protector
        val add_protection : protector -> 'a t -> unit
        val add_cleanup : (unit -> unit) -> 'a t -> unit
        module Elem :
          sig
            type 'a elem = 'E.elem
            type initial = E.initial
            val reader : unit -> in_channel -> initial elem
            val of_string : unit -> string -> initial elem
            val string_of : unit -> 'a elem -> string
          end
        type 'a elem = 'Elem.elem
        type initial = Elem.initial
        val elem_reader : Reader.t -> in_channel -> initial elem
        val output :
          ?channel:out_channel ->
          ?init:('a elem -> string) ->
          ?term:('a elem -> string) ->
          ?show:('a elem -> string) -> 'a elem t -> unit
        val channel_of :
          ?procref:Channel.procref ->
          ?before:(unit -> unit) ->
          ?after:(unit -> unit) ->
          ?init:('a elem -> string) ->
          ?term:('a elem -> string) ->
          ?show:('a elem -> string) -> 'a elem t -> in_channel
        val string_list_of :
          ?show:('a elem -> string) -> 'a elem t -> string list
        val string_stream_of :
          ?show:('a elem -> string) -> 'a elem t -> string Stream.t
        val of_channel :
          ?reader:(in_channel -> initial elem) ->
          in_channel -> initial elem t
        val of_file :
          ?reader:(in_channel -> initial elem) -> string -> initial elem t
        val of_command :
          ?procref:Channel.procref ->
          ?dups:Channel.dup_spec ->
          ?reader:(in_channel -> initial elem) -> string -> initial elem t
        val of_program :
          ?procref:Channel.procref ->
          ?dups:Channel.dup_spec ->
          ?reader:(in_channel -> initial elem) ->
          ?path:bool ->
          string -> ?argv0:string -> string list -> initial elem t
        val of_thunk :
          ?procref:Channel.procref ->
          ?dups:Channel.dup_spec ->
          ?reader:(in_channel -> initial elem) ->
          (unit -> unit) -> initial elem t
        val of_string_list :
          ?parse:(string -> initial elem) -> string list -> initial elem t
        val of_string_stream :
          ?parse:(string -> initial elem) ->
          string Stream.t -> initial elem t
      end
end