module CCError:sig
..end
The variant is polymorphic in the error type
Since 0.5
type'a
sequence =('a -> unit) -> unit
type'a
equal ='a -> 'a -> bool
type'a
ord ='a -> 'a -> int
type'a
printer =Buffer.t -> 'a -> unit
type'a
formatter =Format.formatter -> 'a -> unit
type('good, 'bad)
t =[ `Error of 'bad | `Ok of 'good ]
val return : 'a -> ('a, 'err) t
val fail : 'err -> ('a, 'err) t
val of_exn : exn -> ('a, string) t
of_exn e
uses Printexc
to print the exception as a stringval of_exn_trace : exn -> ('a, string) t
of_exn_trace e
is similar to of_exn e
, but it adds the stacktrace
to the error message.
Remember to call Printexc.record_backtrace true
and compile with the
debug flag for this to work.
Since 0.14
val fail_printf : ('a, Buffer.t, unit, ('a, string) t) Pervasives.format4 -> 'a
fail_printf format
uses format
to obtain an error message
and then returns `Error msg
val map : ('a -> 'b) -> ('a, 'err) t -> ('b, 'err) t
val map_err : ('err1 -> 'err2) -> ('a, 'err1) t -> ('a, 'err2) t
val map2 : ('a -> 'b) ->
('err1 -> 'err2) -> ('a, 'err1) t -> ('b, 'err2) t
CCError.map
, but also with a function that can transform
the error message in case of failureval iter : ('a -> unit) -> ('a, 'b) t -> unit
val get_exn : ('a, 'b) t -> 'a
x
from `Ok x
, fails otherwise.
You should be careful with this function, and favor other combinators
whenever possible.Invalid_argument
if the value is an error.val catch : ('a, 'err) t -> ok:('a -> 'b) -> err:('err -> 'b) -> 'b
catch e ~ok ~err
calls either ok
or err
depending on
the value of e
.
This is useful for code that does not want to depend on the exact
definition of ('a, 'b) t
used, for instance once OCaml gets a
standard Result.t
type.val flat_map : ('a -> ('b, 'err) t) -> ('a, 'err) t -> ('b, 'err) t
val (>|=) : ('a, 'err) t -> ('a -> 'b) -> ('b, 'err) t
val (>>=) : ('a, 'err) t -> ('a -> ('b, 'err) t) -> ('b, 'err) t
val equal : ?err:'err equal ->
'a equal -> ('a, 'err) t equal
val compare : ?err:'err ord -> 'a ord -> ('a, 'err) t ord
val fold : success:('a -> 'b) -> failure:('err -> 'b) -> ('a, 'err) t -> 'b
fold ~success ~failure e
opens e
and, if e = `Ok x
, returns
success x
, otherwise e = `Error s
and it returns failure s
.
The functions CCError.guard
, CCError.wrap1
, CCError.wrap2
and CCError.wrap3
now return
exceptions in case of failure,
val guard : (unit -> 'a) -> ('a, exn) t
guard f
runs f ()
and returns its result wrapped in `Ok
. If
f ()
raises some exception e
, then it fails with `Error e
val guard_str : (unit -> 'a) -> ('a, string) t
val guard_str_trace : (unit -> 'a) -> ('a, string) t
CCError.guard_str
but uses CCError.of_exn_trace
instead of CCError.of_exn
so
that the stack trace is printed.val wrap1 : ('a -> 'b) -> 'a -> ('b, exn) t
CCError.guard
but gives the function one argument.val wrap2 : ('a -> 'b -> 'c) -> 'a -> 'b -> ('c, exn) t
CCError.guard
but gives the function two arguments.val wrap3 : ('a -> 'b -> 'c -> 'd) -> 'a -> 'b -> 'c -> ('d, exn) t
CCError.guard
but gives the function three arguments.val pure : 'a -> ('a, 'err) t
CCError.return
val (<*>) : ('a -> 'b, 'err) t -> ('a, 'err) t -> ('b, 'err) t
a <*> b
evaluates a
and b
, and, in case of success, returns
`Ok (a b)
. Otherwise, it fails, and the error of a
is chosen
over the error of b
if both fail.val join : (('a, 'err) t, 'err) t -> ('a, 'err) t
join t
, in case of success, returns `Ok o
from `Ok (`Ok o)
. Otherwise,
it fails with `Error e
where e
is the unwrapped error of t
.val both : ('a, 'err) t -> ('b, 'err) t -> ('a * 'b, 'err) t
both a b
, in case of success, returns `Ok (o, o')
with the ok values
of a
and b
. Otherwise, it fails, and the error of a
is chosen over the
error of b
if both fail.module Infix:sig
..end
val map_l : ('a -> ('b, 'err) t) -> 'a list -> ('b list, 'err) t
val fold_l : ('b -> 'a -> ('b, 'err) t) -> 'b -> 'a list -> ('b, 'err) t
val fold_seq : ('b -> 'a -> ('b, 'err) t) ->
'b -> 'a sequence -> ('b, 'err) t
val choose : ('a, 'err) t list -> ('a, 'err list) t
choose l
selects a member of l
that is a `Ok _
value,
or returns `Error l
otherwise, where l
is the list of errors.val retry : int -> (unit -> ('a, 'err) t) -> ('a, 'err list) t
retry n f
calls f
at most n
times, returning the first result
of f ()
that doesn't fail. If f
fails n
times, retry n f
fails
with the list of successive errors.module type MONAD =sig
..end
module Traverse(
M
:
MONAD
)
:sig
..end
val to_opt : ('a, 'b) t -> 'a option
val of_opt : 'a option -> ('a, string) t
val to_seq : ('a, 'b) t -> 'a sequence
val pp : 'a printer -> ('a, string) t printer
val pp' : 'a printer ->
'e printer -> ('a, 'e) t printer
val print : 'a formatter -> ('a, string) t formatter
val print' : 'a formatter ->
'e formatter -> ('a, 'e) t formatter
One can register exception printers here, so they will be used by CCError.guard
,
CCError.wrap1
, etc. The printers should succeed (print) on exceptions they
can deal with, and re-raise the exception otherwise. For instance
if I register a printer for Not_found
, it could look like:
CCError.register_printer
(fun buf exn -> match exn with
| Not_found -> Buffer.add_string buf "Not_found"
| _ -> raise exn
);;
This way a printer that doesn't know how to deal with an exception will
let other printers do it.val register_printer : exn printer -> unit