ocaml-containers/src/core/CCFun.ml
2022-09-30 20:53:40 +02:00

105 lines
1.6 KiB
OCaml

(* This file is free software, part of containers. See file "license" for more details. *)
(** {1 Basic Functions} *)
let opaque_identity x = x
(* import standard implementations, if any *)
include Sys
include CCShims_.Stdlib
[@@@if ge 4.8]
include Fun
[@@@else_]
external id : 'a -> 'a = "%identity"
let[@inline] flip f x y = f y x
let[@inline] const x _ = x
let[@inline] negate f x = not (f x)
let[@inline] protect ~finally f =
try
let x = f () in
finally ();
x
with e ->
finally ();
raise e
[@@@endif]
let compose f g x = g (f x)
let compose_binop f g x y = g (f x) (f y)
let curry f x y = f (x, y)
let uncurry f (x, y) = f x y
let tap f x =
ignore (f x);
x
let lexicographic f1 f2 x y =
let c = f1 x y in
if c <> 0 then
c
else
f2 x y
let finally ~h ~f =
try
let x = f () in
ignore (h ());
x
with e ->
ignore (h ());
raise e
let finally1 ~h f x =
try
let res = f x in
ignore (h ());
res
with e ->
ignore (h ());
raise e
let finally2 ~h f x y =
try
let res = f x y in
ignore (h ());
res
with e ->
ignore (h ());
raise e
let rec iterate n f x =
if n < 0 then
invalid_arg "CCFun.iterate"
else if n = 0 then
x
else
iterate (n - 1) f (f x)
module Infix = struct
(* default implem for some operators *)
let ( |> ) x f = f x
let ( @@ ) f x = f x
let ( %> ) = compose
let ( % ) f g x = f (g x)
end
include Infix
module Monad (X : sig
type t
end) =
struct
type 'a t = X.t -> 'a
let return x _ = x
let ( >|= ) f g x = g (f x)
let ( >>= ) f g x = g (f x) x
end