package travesty
Install
dune-project
Dependency
Authors
Maintainers
Sources
sha256=6096bfedbab2044c6372c918712bc5e71ffba5a373cdab37398787712c9c83af
sha512=a7a1cd7981af2c16111323cdf72ac6a45a5e58a3701376fdb3d7f3ee15fbf4003e71f94ad882ccea0d308bb229f3ac0b2c9861a231a498c22e44551f1fcf802d
doc/travesty.base_exts/Travesty_base_exts/Option/index.html
Module Travesty_base_exts.OptionSource
Option extensions.
This module contains various extensions for Base's Option module, including adding monadic traversal.
Defined to let this module be used directly in chaining operations etc.
Travesty instances
Options are traversable containers.
include Travesty.Traversable.S1 with type 'a t := 'a t
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.
module With_errors :
Travesty.Traversable.S1_on_monad
with type 'a t := 'a t
and module M := Base.Or_errorWith_errors is shorthand for On_monad (Or_error).
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 ] *)
] (* ] *)Options are also filter-mappable; filter-mapping effectively behaves as monadic bind.
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.
Finally, options are a monad, and take the various monad extensions.
include Travesty.Monad_exts.S with type 'a t := 'a t
Haskell-style operators
then_m x y sequentially composes the actions x and y as with >>=, but, rather than using the returned value of x, it instead just returns y.
compose_m f g is the Kleisli composition of f and g.
Guarded monadic computations
map_when_m ?otherwise condition ~f a is f a when condition is true, and otherwise a (by default, return) otherwise.
when_m ?otherwise condition ~f is f () when condition is true, and otherwise () (by default, return) otherwise.
map_unless_m ?otherwise condition ~f a is f a when condition is false, and otherwise a (by default, return) otherwise.
unless_m ?otherwise condition ~f is f () when condition is false, and otherwise () (by default, return) otherwise.
Executing monadic effects in the middle of pipelines
tee_m val ~f executes f val for its monadic action, then returns val.
Example (using an extended Or_error):
let fail_if_negative x =
On_error.when_m (Int.is_negative x)
~f:(fun () -> Or_error.error_string "value is negative!")
in
Or_error.(
42 |> tee_m ~f:fail_if_negative >>| (fun x -> x * x)
) (* Ok (1764) *)tee val ~f behaves as tee, but takes a non-monadic f.
Example (using an extended Or_error):
let print_if_negative x =
if Int.negative x then Stdio.print_string "value is negative!"
in
Or_error.(
try_get_value ()
>>= tee ~f:print_if_negative
>>= try_use_value ()
)Applying defaults non-eagerly
value_f opt ~default_f behaves like value opt ~default:(default_f ()), but only evaluates the thunk default_f if value is None.
value_f opt ~default_l behaves like value opt ~default:(Lazy.force default_l), but only forces default_l if value is None.
Miscellaneous extension functions
first_some_of_thunks thunks evaluates each thunk in thunks until none remain (in which case, it returns None, or one of the thunks returns Some x (in which case, it returns Some x.