sig
  module type ListSig =
    sig
      type 'a t
      val empty : 'a Reins.Lists.ListSig.t
      val is_empty : 'a Reins.Lists.ListSig.t -> bool
      val length : 'a Reins.Lists.ListSig.t -> int
      val rev : 'a Reins.Lists.ListSig.t -> 'a Reins.Lists.ListSig.t
      val cons : 'a -> 'a Reins.Lists.ListSig.t -> 'a Reins.Lists.ListSig.t
      val snoc : 'a -> 'a Reins.Lists.ListSig.t -> 'a Reins.Lists.ListSig.t
      val hd : 'a Reins.Lists.ListSig.t -> 'a
      val tl : 'a Reins.Lists.ListSig.t -> 'a Reins.Lists.ListSig.t
      val pop : 'a Reins.Lists.ListSig.t -> 'a * 'a Reins.Lists.ListSig.t
      val last : 'a Reins.Lists.ListSig.t -> 'a
      val append :
        'a Reins.Lists.ListSig.t ->
        'a Reins.Lists.ListSig.t -> 'a Reins.Lists.ListSig.t
      val flatten :
        'a Reins.Lists.ListSig.t Reins.Lists.ListSig.t ->
        'a Reins.Lists.ListSig.t
      val from_list : 'a list -> 'a Reins.Lists.ListSig.t
      val to_list : 'a Reins.Lists.ListSig.t -> 'a list
      val iter : ('a -> unit) -> 'a Reins.Lists.ListSig.t -> unit
      val fold : ('a -> 'b -> 'a) -> 'a -> 'b Reins.Lists.ListSig.t -> 'a
      val rev_map :
        ('a -> 'b) -> 'a Reins.Lists.ListSig.t -> 'b Reins.Lists.ListSig.t
      val map :
        ('a -> 'b) -> 'a Reins.Lists.ListSig.t -> 'b Reins.Lists.ListSig.t
      val to_string : ('a -> string) -> 'a Reins.Lists.ListSig.t -> string
      val compare :
        ('a -> 'a -> int) ->
        'a Reins.Lists.ListSig.t -> 'a Reins.Lists.ListSig.t -> int
      val gen :
        (?size:int -> Random.State.t -> 'a) ->
        ?size:int -> Random.State.t -> 'a Reins.Lists.ListSig.t
    end
end