mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-06 11:15:31 -05:00
Kleisli Composition Operator Added
Added the Kleisli composition operator for Option, Result, and CCFun.
This commit is contained in:
parent
99bfa200af
commit
c248d9801c
6 changed files with 49 additions and 0 deletions
|
|
@ -77,7 +77,11 @@ struct
|
||||||
type 'a t = X.t -> 'a
|
type 'a t = X.t -> 'a
|
||||||
|
|
||||||
let[@inline] return x _ = x
|
let[@inline] return x _ = x
|
||||||
|
let[@inline] k_compose f g =
|
||||||
|
(fun x -> f x |> flat_map g)
|
||||||
let[@inline] ( >|= ) f g x = g (f x)
|
let[@inline] ( >|= ) f g x = g (f x)
|
||||||
let[@inline] ( >>= ) f g x = g (f x) x
|
let[@inline] ( >>= ) f g x = g (f x) x
|
||||||
|
let[@inline] ( >=> ) = k_compose
|
||||||
|
let[@inline] ( <=< ) = flip k_compose
|
||||||
end
|
end
|
||||||
[@@inline]
|
[@@inline]
|
||||||
|
|
|
||||||
|
|
@ -105,8 +105,18 @@ end) : sig
|
||||||
val return : 'a -> 'a t
|
val return : 'a -> 'a t
|
||||||
(** Monadic [return]. *)
|
(** Monadic [return]. *)
|
||||||
|
|
||||||
|
val k_compose : ('a -> 'b t) -> ('b -> 'c t) -> ('a -> 'c t)
|
||||||
|
(** Kleisli composition. Monadic equivalent of [compose]. *)
|
||||||
|
|
||||||
val ( >|= ) : 'a t -> ('a -> 'b) -> 'b t
|
val ( >|= ) : 'a t -> ('a -> 'b) -> 'b t
|
||||||
|
(** Mondaic [map]. *)
|
||||||
|
|
||||||
val ( >>= ) : 'a t -> ('a -> 'b t) -> 'b t
|
val ( >>= ) : 'a t -> ('a -> 'b t) -> 'b t
|
||||||
(** Monadic [bind]. *)
|
(** Monadic [bind]. *)
|
||||||
|
|
||||||
|
val ( >=> ) : ('a -> 'b t) -> ('b -> 'c t) -> ('a -> 'c t)
|
||||||
|
(** Monadic [k_compose]. *)
|
||||||
|
|
||||||
|
val ( <=< ) : ('b -> 'c t) -> ('a -> 'b t) -> ('a -> 'c t)
|
||||||
|
(** Reverse monadic [k_compose]. *)
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,11 @@ let[@inline] bind o f = flat_map f o
|
||||||
let ( >>= ) = bind
|
let ( >>= ) = bind
|
||||||
let pure x = Some x
|
let pure x = Some x
|
||||||
|
|
||||||
|
let k_compose f g =
|
||||||
|
(fun x -> f x |> flat_map g)
|
||||||
|
let ( >=> ) = k_compose
|
||||||
|
let ( <=< ) f g = (>=>) g f
|
||||||
|
|
||||||
let ( <*> ) f x =
|
let ( <*> ) f x =
|
||||||
match f, x with
|
match f, x with
|
||||||
| None, _ | _, None -> None
|
| None, _ | _, None -> None
|
||||||
|
|
@ -190,6 +195,10 @@ module Infix = struct
|
||||||
| _ -> None
|
| _ -> None
|
||||||
|
|
||||||
let ( and* ) = ( and+ )
|
let ( and* ) = ( and+ )
|
||||||
|
|
||||||
|
let ( >=> ) = ( >=> )
|
||||||
|
|
||||||
|
let ( <=< ) = ( <=< )
|
||||||
end
|
end
|
||||||
|
|
||||||
include Infix
|
include Infix
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,9 @@ val bind : 'a t -> ('a -> 'b t) -> 'b t
|
||||||
Monadic bind.
|
Monadic bind.
|
||||||
@since 3.0 *)
|
@since 3.0 *)
|
||||||
|
|
||||||
|
val k_compose : ('a -> 'b t) -> ('b -> 'c t) -> ('a -> 'c t)
|
||||||
|
(** Kleisli composition. Monadic equivalent of CCFun.compose *)
|
||||||
|
|
||||||
val map2 : ('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
|
val map2 : ('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
|
||||||
(** [map2 f o1 o2] maps ['a option] and ['b option] to a ['c option] using [f]. *)
|
(** [map2 f o1 o2] maps ['a option] and ['b option] to a ['c option] using [f]. *)
|
||||||
|
|
||||||
|
|
@ -179,6 +182,11 @@ module Infix : sig
|
||||||
val ( and+ ) : 'a t -> 'b t -> ('a * 'b) t
|
val ( and+ ) : 'a t -> 'b t -> ('a * 'b) t
|
||||||
val ( let* ) : 'a t -> ('a -> 'b t) -> 'b t
|
val ( let* ) : 'a t -> ('a -> 'b t) -> 'b t
|
||||||
val ( and* ) : 'a t -> 'b t -> ('a * 'b) t
|
val ( and* ) : 'a t -> 'b t -> ('a * 'b) t
|
||||||
|
|
||||||
|
val ( >=> ) : ('a -> 'b t) -> ('b -> 'c t) -> ('a -> 'c t)
|
||||||
|
(** Monadic [k_compose]. *)
|
||||||
|
val ( <=< ) : ('b -> 'c t) -> ('a -> 'b t) -> ('a -> 'c t)
|
||||||
|
(** Reverse monadic [k_compose]. *)
|
||||||
end
|
end
|
||||||
|
|
||||||
include module type of Infix
|
include module type of Infix
|
||||||
|
|
|
||||||
|
|
@ -125,6 +125,12 @@ let flat_map f e =
|
||||||
| Ok x -> f x
|
| Ok x -> f x
|
||||||
| Error s -> Error s
|
| Error s -> Error s
|
||||||
|
|
||||||
|
let k_compose f g =
|
||||||
|
(fun x -> flat_map g @@ f x)
|
||||||
|
|
||||||
|
let ( >=> ) = k_compose
|
||||||
|
let ( <=< ) f g = ( >=> ) g f
|
||||||
|
|
||||||
let equal ~err eq a b =
|
let equal ~err eq a b =
|
||||||
match a, b with
|
match a, b with
|
||||||
| Ok x, Ok y -> eq x y
|
| Ok x, Ok y -> eq x y
|
||||||
|
|
@ -275,6 +281,9 @@ module Infix = struct
|
||||||
| _, Error e -> Error e
|
| _, Error e -> Error e
|
||||||
|
|
||||||
let ( and* ) = ( and+ )
|
let ( and* ) = ( and+ )
|
||||||
|
|
||||||
|
let ( >=> ) = ( >=> )
|
||||||
|
let ( <=< ) = ( <=< )
|
||||||
end
|
end
|
||||||
|
|
||||||
include Infix
|
include Infix
|
||||||
|
|
|
||||||
|
|
@ -113,6 +113,10 @@ val catch : ('a, 'err) t -> ok:('a -> 'b) -> err:('err -> 'b) -> 'b
|
||||||
the value of [e]. *)
|
the value of [e]. *)
|
||||||
|
|
||||||
val flat_map : ('a -> ('b, 'err) t) -> ('a, 'err) t -> ('b, 'err) t
|
val flat_map : ('a -> ('b, 'err) t) -> ('a, 'err) t -> ('b, 'err) t
|
||||||
|
|
||||||
|
val k_compose : ('a -> ('b, 'err) t) -> ('b -> ('c, 'err) t) -> ('a -> ('c, 'err) t)
|
||||||
|
(** Kleisli composition. Monadic equivalent of CCFun.compose *)
|
||||||
|
|
||||||
val equal : err:'err equal -> 'a equal -> ('a, 'err) t equal
|
val equal : err:'err equal -> 'a equal -> ('a, 'err) t equal
|
||||||
val compare : err:'err ord -> 'a ord -> ('a, 'err) t ord
|
val compare : err:'err ord -> 'a ord -> ('a, 'err) t ord
|
||||||
|
|
||||||
|
|
@ -199,6 +203,11 @@ module Infix : sig
|
||||||
|
|
||||||
val ( and* ) : ('a, 'e) t -> ('b, 'e) t -> ('a * 'b, 'e) t
|
val ( and* ) : ('a, 'e) t -> ('b, 'e) t -> ('a * 'b, 'e) t
|
||||||
(** @since 2.8 *)
|
(** @since 2.8 *)
|
||||||
|
|
||||||
|
val ( >=> ) : ('a -> ('b, 'err) t) -> ('b -> ('c, 'err) t) -> ('a -> ('c, 'err) t)
|
||||||
|
(** Monadic [k_compose]. *)
|
||||||
|
val ( <=< ) : ('b -> ('c, 'err) t) -> ('a -> ('b, 'err) t) -> ('a -> ('c, 'err) t)
|
||||||
|
(** Reverse monadic [k_compose]. *)
|
||||||
end
|
end
|
||||||
|
|
||||||
include module type of Infix
|
include module type of Infix
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue