package travesty
Install
dune-project
Dependency
Authors
Maintainers
Sources
sha256=6096bfedbab2044c6372c918712bc5e71ffba5a373cdab37398787712c9c83af
sha512=a7a1cd7981af2c16111323cdf72ac6a45a5e58a3701376fdb3d7f3ee15fbf4003e71f94ad882ccea0d308bb229f3ac0b2c9861a231a498c22e44551f1fcf802d
doc/travesty.base_exts/Travesty_base_exts/List/index.html
Module Travesty_base_exts.ListSource
List extensions.
This module contains various extensions for Base's List module, including adding monadic traversal.
Defined to let this module be used directly in chaining operations etc.
Travesty instances
Extended With_errors, adding functions specific to working with lists in an error-prone context.
Lists are traversable containers, but have an extended With_errors submodule.
include Travesty.Traversable.S1
with type 'a t := 'a t
and module With_errors := With_errors
module On_monad
(M : Base.Monad.S) :
Travesty.Traversable.S1_on_monad with type 'a t := 'a t and module M := MOn_monad implements monadic folding and mapping operators for a given monad M, including arity-1 specific operators.
include Travesty.Traversable.Generic
with type 'a t := 'a t
and type 'a elt := 'a
and module On_monad := On_monad
and module With_errors := With_errors
include Travesty.Types_intf.Generic
with type 'a t := 'a t
with type 'a elt := 'a
We can do generic container operations.
include Base.Container.Generic with type 'a t := 'a t and type 'a elt := 'a
We can do non-monadic mapping operations.
include Travesty.Mappable.Generic with type 'a t := 'a t and type 'a elt := 'a
Generic refers to the container type as 'a t, and the element type as 'a elt; substitute t/elt (arity-0) or 'a t/'a (arity-1) accordingly below.
include Travesty.Types_intf.Generic
with type 'a t := 'a t
with type 'a elt := 'a
fold_map c ~f ~init folds f over every t in c, threading through an accumulator with initial value init.
include Travesty.Mappable.S1_container with type 'a t := 'a t
include Travesty.Mappable.S1 with type 'a t := 'a t
include Travesty.Mappable.Generic with type 'a t := 'a t and type 'a elt := 'a
Generic refers to the container type as 'a t, and the element type as 'a elt; substitute t/elt (arity-0) or 'a t/'a (arity-1) accordingly below.
include Travesty.Types_intf.Generic
with type 'a t := 'a t
with type 'a elt := 'a
include Base.Container.S1 with type 'a t := 'a t
Checks whether the provided element is there, using equal.
fold t ~init ~f returns f (... f (f (f init e1) e2) e3 ...) en, where e1..en are the elements of t
val fold_result :
'a t ->
init:'accum ->
f:('accum -> 'a -> ('accum, 'e) Base.Result.t) ->
('accum, 'e) Base.Result.tfold_result t ~init ~f is a short-circuiting version of fold that runs in the Result monad. If f returns an Error _, that value is returned without any additional invocations of f.
val fold_until :
'a t ->
init:'accum ->
f:('accum -> 'a -> ('accum, 'final) Base.Container.Continue_or_stop.t) ->
finish:('accum -> 'final) ->
'finalfold_until t ~init ~f ~finish is a short-circuiting version of fold. If f returns Stop _ the computation ceases and results in that value. If f returns Continue _, the fold will proceed. If f never returns Stop _, the final result is computed by finish.
Example:
type maybe_negative =
| Found_negative of int
| All_nonnegative of { sum : int }
(** [first_neg_or_sum list] returns the first negative number in [list], if any,
otherwise returns the sum of the list. *)
let first_neg_or_sum =
List.fold_until ~init:0
~f:(fun sum x ->
if x < 0
then Stop (Found_negative x)
else Continue (sum + x))
~finish:(fun sum -> All_nonnegative { sum })
;;
let x = first_neg_or_sum [1; 2; 3; 4; 5]
val x : maybe_negative = All_nonnegative {sum = 15}
let y = first_neg_or_sum [1; 2; -3; 4; 5]
val y : maybe_negative = Found_negative -3Returns true if and only if there exists an element for which the provided function evaluates to true. This is a short-circuiting operation.
Returns true if and only if the provided function evaluates to true for all elements. This is a short-circuiting operation.
Returns the number of elements for which the provided function evaluates to true.
val sum :
(module Base.Container.Summable with type t = 'sum) ->
'a t ->
f:('a -> 'sum) ->
'sumReturns the sum of f i for all i in the container.
Returns as an option the first element for which f evaluates to true.
Returns the first evaluation of f that returns Some, and returns None if there is no such element.
Returns a minimum (resp maximum) element from the collection using the provided compare function, or None if the collection is empty. In case of a tie, the first element encountered while traversing the collection is returned. The implementation uses fold so it has the same complexity as fold.
include Travesty.Mappable.Extensions1 with type 'a t := 'a t
Extensions1 includes the container extensions from Container_exts, as they work with any arity-1 container.
include Travesty.Container_exts.S1 with type 'a t := 'a t
include Travesty.Container_exts.Generic
with type 'a t := 'a t
and type 'a elt := 'a
Generic_extensions refers to the container type as 'a t, and the element type as 'a elt; substitute t/elt (arity-0) or 'a t/'a (arity-1) accordingly below.
include Travesty.Types_intf.Generic
with type 'a t := 'a t
with type 'a elt := 'a
Testing for a specific number of elements
The following functions help in checking whether a container has a particular, commonly-required number of elements (zero or one, one, two, and so on).
at_most_one xs returns Ok None if xs is empty; Ok Some(x) if it contains only x; and an error otherwise.
Examples (using an extended version of List):
List.at_most_one [] (* ok None *)
at_most_one [1] (* ok (Some 1) *)
at_most_one [1; 2] (* error -- too many *)one xs returns Ok x if xs contains only x, and an error otherwise.
Examples (using an extended version of List):
List.one [] (* error -- not enough *)
one [1] (* ok 1 *)
one [1; 2] (* error -- too many *)two xs returns Ok (x, y) if xs is a list containing only x and y in that order, and an error otherwise.
Examples (using an extended version of List):
List.two [] (* error -- not enough *)
two [1] (* error -- not enough *)
two [1; 2] (* ok (1, 2) *)
two [1; 2; 3] (* error -- too many *)Miscellaneous extensions
Predicate extensions are available on all arity-1 containers, provided that we fix the element type parameter to 'a -> bool.
include Travesty.Container_exts.Generic_predicate
with type 'a t := ('a -> Base.bool) t
and type 'a item := 'a
any x ~predicates tests x against predicates until one returns true, in which case it returns true; or all return false, in which case it returns false.
any x ~predicates tests x against predicates until one returns false, in which case it returns false; or all return true, in which case it returns true.
right_pad ~padding xs pads every list in xs with padding, ensuring all lists have equal length.
Example:
right_pad ~padding:6
[ [0; 8; 0; 0] (* [ [ 0; 8; 0; 0; 6 ] *)
; [9; 9; 9] (* ; [ 9; 9; 9; 6; 6 ] *)
; [8; 8; 1; 9; 9] (* ; [ 8; 8; 1; 9; 9 ] *)
; [9; 1; 1; 9] (* ; [ 9; 1; 1; 9; 6 ] *)
; [7; 2; 5] (* ; [ 7; 2; 5; 6; 6 ] *)
; [3] (* ; [ 3; 6; 6; 6; 6 ] *)
] (* ] *)We can also filter-map over them.
include Travesty.Filter_mappable.S1 with type 'a t := 'a t
include Travesty.Filter_mappable.Generic
with type 'a t := 'a t
and type 'a elt := 'a
Generic strictly extends Generic_basic.
include Travesty.Filter_mappable.Generic_basic
with type 'a t := 'a t
with type 'a elt := 'a
Generic_basic refers to the container type as 'a t, and the element type as 'a elt; substitute t/elt (arity-0) or 'a t/'a (arity-1) accordingly below.
include Travesty.Types_intf.Generic
with type 'a t := 'a t
with type 'a elt := 'a
filter_map c ~f maps f over every t in c, discarding any items for which f returns None.
filter c ~f checks f over every t in c, discarding any items for which f returns false.
exclude c ~f checks f over every t in c, discarding any items for which f returns true.
We can also derive Mappable interfaces from filter-mappable ones, but leave that to a separate functor.
Utility functions for modifying lists
replace xs at ~f tries to replace the value at index at in xs using the function f. f may return None, in which case the item is removed.
Examples:
replace [1; 2; 3] 1 ~f:(fun _ -> None) (* Ok [1; 3] *)
replace [1; 2; 3] 2 ~f:(fun x -> Some (x + 1)) (* Ok [1; 2; 4] *)insert xs at value tries to insert value at index at in xs.
Miscellaneous extension functions
prefixes xs returns all non-empty prefixes of xs.
Examples:
prefixes [] (* [] *)
prefixes [1; 2; 3] (* [ [ 1 ]; [ 1; 2 ]; [ 1; 2; 3 ] *)