module List: Listtype'at ='a list
include Container.S1
include Monad.S
val nth : 'a t -> int -> 'a optionval nth_exn : 'a t -> int -> 'an-th element of the given list.
    The first element (head of the list) is at position 0.
    Raise Failure "nth" if the list is too short.
    Raise Invalid_argument "List.nth" if n is negative.val rev : 'a t -> 'a tval rev_append : 'a t -> 'a t -> 'a tList.rev_append l1 l2 reverses l1 and concatenates it to l2.  This is equivalent
    to (List.rev l1) @ l2, but rev_append is more efficient.val unordered_append : 'a t -> 'a t -> 'a tval rev_map : 'a t -> f:('a -> 'b) -> 'b tList.rev_map f l gives the same result as
   List.rev (ListLabels.map f l), but is more efficient.val fold_left : 'a t -> init:'b -> f:('b -> 'a -> 'b) -> 'bval iter2_exn : 'a t -> 'b t -> f:('a -> 'b -> unit) -> unitList.iter2_exn f [a1; ...; an] [b1; ...; bn] calls in turn
    f a1 b1; ...; f an bn.
    Raise Invalid_argument if the two lists have
    different lengths.val rev_map2_exn : 'a t -> 'b t -> f:('a -> 'b -> 'c) -> 'c tList.rev_map2_exn f l1 l2 gives the same result as
   List.rev (List.map2_exn f l1 l2), but is more efficient.val fold2_exn : 'a t -> 'b t -> init:'c -> f:('c -> 'a -> 'b -> 'c) -> 'cList.fold2_exn f a [b1; ...; bn] [c1; ...; cn] is
   f (... (f (f a b1 c1) b2 c2) ...) bn cn.
   Raise Invalid_argument if the two lists have
   different lengths.val for_all2_exn : 'a t -> 'b t -> f:('a -> 'b -> bool) -> boolList.for_all, but for a two-argument predicate.
   Raise Invalid_argument if the two lists have
   different lengths.val exists2_exn : 'a t -> 'b t -> f:('a -> 'b -> bool) -> boolList.exists, but for a two-argument predicate.  Raise
    Invalid_argument if the end of one list is reached before the end of the
    other.val filter : 'a t -> f:('a -> bool) -> 'a tfilter p l returns all the elements of the list l that satisfy the predicate p.
    The order of the elements in the input list is preserved.val rev_filter : 'a t -> f:('a -> bool) -> 'a tfilter, but reverses the order of the input listval filteri : 'a t -> f:(int -> 'a -> bool) -> 'a tval partition_map : 'a t ->
       f:('a -> [ `Fst of 'b | `Snd of 'c ]) -> 'b t * 'c tpartition_map t ~f partitions t according to f.val partition_tf : 'a t -> f:('a -> bool) -> 'a t * 'a tpartition_tf p l returns a pair of lists (l1, l2), where l1 is the list of all the
    elements of l that satisfy the predicate p, and l2 is the list of all the
    elements of l that do not satisfy p.  The order of the elements in the input list
    is preserved.  The "tf" suffix is mnemonic to remind readers at a call that the result
    is (trues, falses).val split_n : 'a t -> int -> 'a t * 'a tsplit_n n [e1; ...; em] is ([e1; ...; en], [en+1; ...; em]).  If n > m,
    ([e1; ...; em], []) is returned.  If n < 0, ([], [e1; ...; em]) is
    returned.val sort : cmp:('a -> 'a -> int) -> 'a t -> 'a tPervasives.compare is a suitable comparison
    function.
The current implementation uses Merge Sort. It runs in constant heap space and logarithmic stack space.
    Presently, the sort is stable, meaning that two equal elements in the input will be in
    the same order in the output.
val stable_sort : cmp:('a -> 'a -> int) -> 'a t -> 'a tval merge : 'a t -> 'a t -> cmp:('a -> 'a -> int) -> 'a tl1 and l2 are sorted according to the comparison
    function cmp, merge cmp l1 l2 will return a sorted list containting all the
    elements of l1 and l2.  If several elements compare equal, the elements of l1
    will be before the elements of l2.val hd : 'a t -> 'a optionval tl : 'a t -> 'a t optionval hd_exn : 'a t -> 'aFailure "hd" if the list is empty.val tl_exn : 'a t -> 'a tFailure "tl" if the list is
    empty.val findi : 'a t -> f:(int -> 'a -> bool) -> (int * 'a) optionval find_exn : 'a t -> f:('a -> bool) -> 'afind_exn t ~f returns the first element of t that satisfies f.  It raises
    Not_found if there is no such element.val append : 'a t -> 'a t -> 'a tappend [1; 2] [3; 4; 5] is [1; 2; 3; 4; 5]val map : 'a t -> f:('a -> 'b) -> 'b tList.map f [a1; ...; an] applies function f to a1, ..., an, and builds the list
    [f a1; ...; f an] with the results returned by f.val concat_map : 'a t -> f:('a -> 'b t) -> 'b tconcat_map t ~f is concat (map t ~f), except that there is no guarantee about the
    order in which f is applied to the elements of t.val concat_mapi : 'a t -> f:(int -> 'a -> 'b t) -> 'b tconcat_mapi t ~f is like concat_map, but passes the index as an argumentval map2_exn : 'a t -> 'b t -> f:('a -> 'b -> 'c) -> 'c tList.map2_exn f [a1; ...; an] [b1; ...; bn] is [f a1 b1; ...; f an bn].  Raise
    Invalid_argument if the two lists have different lengths.val rev_map3_exn : 'a t ->
       'b t ->
       'c t -> f:('a -> 'b -> 'c -> 'd) -> 'd tval map3_exn : 'a t ->
       'b t ->
       'c t -> f:('a -> 'b -> 'c -> 'd) -> 'd tval rev_map_append : 'a t -> 'b t -> f:('a -> 'b) -> 'b trev_map_append ~f l1 l2 reverses l1 mapping f over each
    element, and appends the result to the front of l2.val fold_right : 'a t -> f:('a -> 'b -> 'b) -> init:'b -> 'bList.fold_right f [a1; ...; an] b is
    f a1 (f a2 (... (f an b) ...)).val unzip : ('a * 'b) t -> 'a t * 'b tunzip [(a1,b1); ...; (an,bn)] is ([a1; ...; an], [b1; ...; bn]).val zip : 'a t -> 'b t -> ('a * 'b) t optionzip [a1; ...; an] [b1; ...; bn] is [(a1,b1); ...; (an,bn)].
    Returns None if the two lists have different lengths.val zip_exn : 'a t -> 'b t -> ('a * 'b) tval mapi : 'a t -> f:(int -> 'a -> 'b) -> 'b tval rev_mapi : 'a t -> f:(int -> 'a -> 'b) -> 'b tval iteri : 'a t -> f:(int -> 'a -> unit) -> unitval foldi : 'a t -> f:(int -> 'b -> 'a -> 'b) -> init:'b -> 'bval reduce_exn : 'a t -> f:('a -> 'a -> 'a) -> 'areduce f [a1; ...; an] is f (... (f (f a1 a2) a3) ...) an.
    It fails on the empty list.  Tail recursive.val reduce : 'a t -> f:('a -> 'a -> 'a) -> 'a optionval group : 'a t -> break:('a -> 'a -> bool) -> 'a t tgroup l ~break returns a list of lists (i.e., groups) whose concatenation is
    equal to the original list.  Each group is broken where break returns true on
    a pair of successive elements.
Example
    group ~break:(<>) 'M';'i';'s';'s';'i';'s';'s';'i';'p';'p';'i' ->
    ['M'];['i'];['s';'s'];['i'];['s';'s'];['i'];['p';'p'];['i']
val groupi : 'a t ->
       break:(int -> 'a -> 'a -> bool) -> 'a t tExample, group the chars of Mississippi into triples
    groupi ~break:(fun i _ _ -> i mod 3 = 0)
    'M';'i';'s';'s';'i';'s';'s';'i';'p';'p';'i' ->
    ['M'; 'i'; 's']; ['s'; 'i'; 's']; ['s'; 'i'; 'p']; ['p'; 'i']
val last : 'a t -> 'a optionval last_exn : 'a t -> 'aval dedup : ?compare:('a -> 'a -> int) -> 'a t -> 'a tdedup (de-duplicate).  The same list with duplicates removed, but the
    order is not guaranteed.val contains_dup : ?compare:('a -> 'a -> int) -> 'a t -> boolcontains_dup True if there are any two elements in the list which are the same.val find_a_dup : ?compare:('a -> 'a -> int) -> 'a t -> 'a optionfind_a_dup returns a duplicate from the list (no guarantees about which
    duplicate you get), or None if there are no dups.exception Duplicate_found of (unit -> Sexplib.Sexp.t) * string
val exn_if_dup : ?compare:('a -> 'a -> int) ->
       ?context:string -> 'a t -> to_sexp:('a -> Sexplib.Sexp.t) -> unitexn_if_dup ?compare ?context t ~to_sexp will run find_a_dup on t, and raise
    Duplicate_found if a duplicate is found.  The context is the second argument of
    the exceptionval count : 'a t -> f:('a -> bool) -> intcount f l is the number of elements in l that satisfy the
    predicate f.val range : ?stride:int ->
       ?start:[ `exclusive | `inclusive ] ->
       ?stop:[ `exclusive | `inclusive ] -> int -> int -> int trange ?stride ?start ?stop start_i stop_i is the list of integers from start_i to
    stop_i, stepping by stride.  If stride < 0 then we need start_i > stop_i for
    the result to be nonempty (or start_i = stop_i in the case where both bounds are
    inclusive).val init : int -> f:(int -> 'a) -> 'a tinit f n is [(f 0); (f 1); ...; (f (n-1))]. It is an error if n < 0.val rev_filter_map : 'a t -> f:('a -> 'b option) -> 'b trev_filter_map f l is the reversed sublist of l containing
    only elements for which f returns Some e.val rev_filter_mapi : 'a t -> f:(int -> 'a -> 'b option) -> 'b tval filter_map : 'a t -> f:('a -> 'b option) -> 'b tfilter_map f l is the sublist of l containing only elements
    for which f returns Some e.val filter_mapi : 'a t -> f:(int -> 'a -> 'b option) -> 'b tval filter_opt : 'a option t -> 'a tfilter_opt l is the sublist of l containing only elements
    which are Some e.  In other words, filter_opt l = filter_map ~f:ident l.module Assoc:sig..end
sub, unlike slice, doesn't use python-style indices!val sub : 'a t -> pos:int -> len:int -> 'a tsub pos len l is the len-element sublist of l, starting at pos.val slice : 'a t -> int -> int -> 'a tslice l start stop returns a new list including elements l.(start) through
    l.(stop-1), normalized python-style.val take : 'a t -> int -> 'a ttake l n is fst (split_n n l).
    drop l n is snd (split_n n l).val drop : 'a t -> int -> 'a tval take_while : 'a t -> f:('a -> bool) -> 'a ttake_while l ~f returns the longest prefix of l for which f is true.val drop_while : 'a t -> f:('a -> bool) -> 'a tdrop_while l ~f drops the longest prefix of l for which f is true.val concat : 'a t t -> 'a tval concat_no_order : 'a t t -> 'a tconcat but faster and without preserving any ordering (ie for lists that are
    essentially viewed as multi-sets.val cons : 'a -> 'a t -> 'a tval cartesian_product : 'a t -> 'b t -> ('a * 'b) tval to_string : f:('a -> string) -> 'a t -> stringval permute : ?random_state:Random.State.t -> 'a t -> 'a tpermute ?random_state t returns a permutation of t.
    permute side affects random_state by repeated calls to Random.State.int.
    If random_state is not supplied, permute uses Random.State.default.
val is_sorted : 'a t -> compare:('a -> 'a -> int) -> boolval compare : 'a t -> 'a t -> cmp:('a -> 'a -> int) -> intval equal : 'a t -> 'a t -> equal:('a -> 'a -> bool) -> boolmodule Infix:sig..end
val transpose : 'a t t -> 'a t t optiontranspose m transposes the rows and columns of the matrix m,
    considered as either a row of column lists or (dually) a column of row lists.
Example,
    transpose [1;2;3];[4;5;6] = [1;4];[2;5];[3;6]
    On non-empty rectangular matrices, transpose is an involution
    (i.e., transpose (transpose m) = m).  Transpose returns None when called
    on lists of lists with non-uniform lengths.
*
val transpose_exn : 'a t t -> 'a t ttranspose_exn transposes the rows and columns of its argument, throwing exception if
    the list is not rectangular.
*val t_of_sexp : (Sexplib.Sexp.t -> 'a) -> Sexplib.Sexp.t -> 'a tval sexp_of_t : ('a -> Sexplib.Sexp.t) -> 'a t -> Sexplib.Sexp.tval bin_t : 'a Bin_prot.Type_class.t -> 'a t Bin_prot.Type_class.tval bin_read_t : 'a Bin_prot.Unsafe_read_c.reader -> 'a t Bin_prot.Read_ml.readerval bin_read_t_ : 'a Bin_prot.Unsafe_read_c.reader ->
       'a t Bin_prot.Unsafe_read_c.readerval bin_read_t__ : 'a Bin_prot.Unsafe_read_c.reader ->
       (int -> 'a t) Bin_prot.Unsafe_read_c.readerval bin_reader_t : 'a Bin_prot.Type_class.reader -> 'a t Bin_prot.Type_class.readerval bin_size_t : 'a Bin_prot.Size.sizer -> 'a t Bin_prot.Size.sizerval bin_write_t : 'a Bin_prot.Unsafe_write_c.writer -> 'a t Bin_prot.Write_ml.writerval bin_write_t_ : 'a Bin_prot.Unsafe_write_c.writer ->
       'a t Bin_prot.Unsafe_write_c.writerval bin_writer_t : 'a Bin_prot.Type_class.writer -> 'a t Bin_prot.Type_class.writer