sig
  module type S =
    sig
      type 'a t
      type 'a elt
      type 'a cursor
      type 'a collection
      type direction
      type 'a traversal =
          Traverse_All
        | Traverse_If of ('a -> bool)
        | Traverse_While of ('a -> bool)
      val create :
        Reins.Iterator.S.direction ->
        'a Reins.Iterator.S.elt Reins.Iterator.S.traversal ->
        'a Reins.Iterator.S.collection -> 'a Reins.Iterator.S.t
      val from_cursor :
        Reins.Iterator.S.direction ->
        'a Reins.Iterator.S.elt Reins.Iterator.S.traversal ->
        'a Reins.Iterator.S.cursor -> 'a Reins.Iterator.S.t
      val value : 'a Reins.Iterator.S.t -> 'a Reins.Iterator.S.elt option
      val get_value : 'a Reins.Iterator.S.t -> 'a Reins.Iterator.S.elt
      val at_end : 'a Reins.Iterator.S.t -> bool
      val at_beg : 'a Reins.Iterator.S.t -> bool
      val has_next : 'a Reins.Iterator.S.t -> bool
      val next : 'a Reins.Iterator.S.t -> 'a Reins.Iterator.S.t
      val has_prev : 'a Reins.Iterator.S.t -> bool
      val prev : 'a Reins.Iterator.S.t -> 'a Reins.Iterator.S.t
      val goto_beg : 'a Reins.Iterator.S.t -> 'a Reins.Iterator.S.t
      val goto_end : 'a Reins.Iterator.S.t -> 'a Reins.Iterator.S.t
      val flip : 'a Reins.Iterator.S.t -> 'a Reins.Iterator.S.t
      val iter :
        ('a Reins.Iterator.S.elt -> unit) -> 'a Reins.Iterator.S.t -> unit
      val fold :
        ('a -> 'b Reins.Iterator.S.elt -> 'a) ->
        'a -> 'b Reins.Iterator.S.t -> 'a
    end
end