mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-07 11:45:31 -05:00
merge from master
This commit is contained in:
commit
c81a7302fb
9 changed files with 102 additions and 36 deletions
|
|
@ -1,9 +1,6 @@
|
|||
ocaml-containers
|
||||
================
|
||||
|
||||
A bunch of modules I wrote mostly for fun. It is currently divided into
|
||||
a few parts:
|
||||
|
||||
1. A usable, reasonably well-designed library that extends OCaml's standard
|
||||
library (in `core/`, packaged under `containers` in ocamlfind. Modules
|
||||
are totally independent and are prefixed with `CC` (for "containers-core"
|
||||
|
|
|
|||
17
_oasis
17
_oasis
|
|
@ -1,6 +1,6 @@
|
|||
OASISFormat: 0.4
|
||||
Name: containers
|
||||
Version: 0.3
|
||||
Version: 0.3.1-alpha
|
||||
Homepage: https://github.com/c-cube/ocaml-containers
|
||||
Authors: Simon Cruanes
|
||||
License: BSD-2-clause
|
||||
|
|
@ -9,11 +9,16 @@ Plugins: META (0.3), DevFiles (0.3)
|
|||
OCamlVersion: >= 4.00.1
|
||||
BuildTools: ocamlbuild
|
||||
|
||||
Synopsis: A bunch of modules, including polymorphic containers.
|
||||
Description:
|
||||
A bunch of useful modules, including polymorphic containers, graph
|
||||
abstractions, serialization systems, testing systems and various
|
||||
experiments.
|
||||
Synopsis: A modular standard library focused on data structures.
|
||||
Description:
|
||||
Containers is a standard library (BSD license) focused on data structures,
|
||||
combinators and iterators, without dependencies on unix. Every module is
|
||||
independent and is prefixed with 'CC' in the global namespace. Some modules
|
||||
extend the stdlib (e.g. CCList provides safe map/fold_right/append, and
|
||||
additional functions on lists).
|
||||
|
||||
It also features an optional library for dealing with strings, and a `misc`
|
||||
library full of experimental ideas (not stable, not necessarily usable).
|
||||
|
||||
Flag "misc"
|
||||
Description: Build the misc library, containing everything from
|
||||
|
|
|
|||
|
|
@ -159,13 +159,18 @@ let rec _exists2 p a1 a2 i1 i2 j1 =
|
|||
(* shuffle a[i...j[ using the given int random generator
|
||||
See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle *)
|
||||
let _shuffle _rand_int a i j =
|
||||
for k = i to j do
|
||||
let l = _rand_int k in
|
||||
for k = j-1 downto i+1 do
|
||||
let l = _rand_int (k+1) in
|
||||
let tmp = a.(l) in
|
||||
a.(l) <- a.(k);
|
||||
a.(l) <- tmp;
|
||||
a.(k) <- tmp;
|
||||
done
|
||||
|
||||
(*$T
|
||||
let st = Random.State.make [||] in let a = 0--10000 in \
|
||||
let b = Array.copy a in shuffle_with st a; a <> b
|
||||
*)
|
||||
|
||||
let _choose a i j st =
|
||||
if i>=j then raise Not_found;
|
||||
a.(i+Random.int (j-i))
|
||||
|
|
|
|||
|
|
@ -58,3 +58,10 @@ let finally ~h ~f =
|
|||
with e ->
|
||||
h ();
|
||||
raise e
|
||||
|
||||
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
|
||||
|
|
|
|||
|
|
@ -67,3 +67,14 @@ val finally : h:(unit -> unit) -> f:(unit -> 'a) -> 'a
|
|||
(** [finally h f] calls [f ()] and returns its result. If it raises, the
|
||||
same exception is raised; in {b any} case, [h ()] is called after
|
||||
[f ()] terminates. *)
|
||||
|
||||
(** {2 Monad}
|
||||
|
||||
functions with a fixed domain are monads in their codomain *)
|
||||
|
||||
module Monad(X : sig type t end) : sig
|
||||
type 'a t = X.t -> 'a
|
||||
val return : 'a -> 'a t
|
||||
val (>|=) : 'a t -> ('a -> 'b) -> 'b t
|
||||
val (>>=) : 'a t -> ('a -> 'b t) -> 'b t
|
||||
end
|
||||
|
|
|
|||
|
|
@ -71,6 +71,12 @@ let (<*>) f x = match f, x with
|
|||
|
||||
let (<$>) = map
|
||||
|
||||
let (<+>) a b = match a with
|
||||
| None -> b
|
||||
| Some _ -> a
|
||||
|
||||
let choice l = List.fold_left (<+>) None l
|
||||
|
||||
let map2 f o1 o2 = match o1, o2 with
|
||||
| None, _
|
||||
| _, None -> None
|
||||
|
|
@ -84,6 +90,24 @@ let fold f acc o = match o with
|
|||
| None -> acc
|
||||
| Some x -> f acc x
|
||||
|
||||
let get_exn = function
|
||||
| Some x -> x
|
||||
| None -> invalid_arg "CCOpt.get_exn"
|
||||
|
||||
let sequence_l l =
|
||||
let rec aux acc l = match l with
|
||||
| [] -> Some (List.rev acc)
|
||||
| Some x :: l' -> aux (x::acc) l'
|
||||
| None :: _ -> raise Exit
|
||||
in
|
||||
try aux [] l with Exit -> None
|
||||
|
||||
(*$T
|
||||
sequence_l [None; Some 1; Some 2] = None
|
||||
sequence_l [Some 1; Some 2; Some 3] = Some [1;2;3]
|
||||
sequence_l [] = Some []
|
||||
*)
|
||||
|
||||
let to_list o = match o with
|
||||
| None -> []
|
||||
| Some x -> [x]
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
||||
(** {1 Options} *)
|
||||
|
||||
type 'a t = 'a option
|
||||
type +'a t = 'a option
|
||||
|
||||
val map : ('a -> 'b) -> 'a t -> 'b t
|
||||
(** Transform the element inside, if any *)
|
||||
|
|
@ -52,10 +52,6 @@ val (>>=) : 'a t -> ('a -> 'b t) -> 'b t
|
|||
val flat_map : ('a -> 'b t) -> 'a t -> 'b t
|
||||
(** Flip version of {!>>=} *)
|
||||
|
||||
val (<*>) : ('a -> 'b) t -> 'a t -> 'b t
|
||||
|
||||
val (<$>) : ('a -> 'b) -> 'a t -> 'b t
|
||||
|
||||
val map2 : ('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
|
||||
|
||||
val iter : ('a -> unit) -> 'a t -> unit
|
||||
|
|
@ -64,6 +60,26 @@ val iter : ('a -> unit) -> 'a t -> unit
|
|||
val fold : ('a -> 'b -> 'a) -> 'a -> 'b t -> 'a
|
||||
(** Fold on 0 or 1 elements *)
|
||||
|
||||
val get_exn : 'a t -> 'a
|
||||
(** Open the option, possibly failing if it is [None]
|
||||
@raise Invalid_argument if the option is [None] *)
|
||||
|
||||
val sequence_l : 'a t list -> 'a list t
|
||||
|
||||
(** {2 Applicative} *)
|
||||
|
||||
val (<*>) : ('a -> 'b) t -> 'a t -> 'b t
|
||||
|
||||
val (<$>) : ('a -> 'b) -> 'a t -> 'b t
|
||||
|
||||
(** {2 Alternatives} *)
|
||||
|
||||
val (<+>) : 'a t -> 'a t -> 'a t
|
||||
(** [a <+> b] is [a] if [a] is [Some _], [b] otherwise *)
|
||||
|
||||
val choice : 'a t list -> 'a t
|
||||
(** [choice] returns the first non-[None] element of the list, or [None] *)
|
||||
|
||||
(** {2 Conversion and IO} *)
|
||||
|
||||
val to_list : 'a t -> 'a list
|
||||
|
|
|
|||
26
core/META
26
core/META
|
|
@ -1,15 +1,15 @@
|
|||
# OASIS_START
|
||||
# DO NOT EDIT (digest: 854ed9ebed0116b5b8aa2f30b4b72738)
|
||||
version = "0.3"
|
||||
description = "A bunch of modules, including polymorphic containers."
|
||||
# DO NOT EDIT (digest: 38ca5655da37b1039f2aa919ef60de51)
|
||||
version = "0.3.1-alpha"
|
||||
description = "A modular standard library focused on data structures."
|
||||
archive(byte) = "containers.cma"
|
||||
archive(byte, plugin) = "containers.cma"
|
||||
archive(native) = "containers.cmxa"
|
||||
archive(native, plugin) = "containers.cmxs"
|
||||
exists_if = "containers.cma"
|
||||
package "thread" (
|
||||
version = "0.3"
|
||||
description = "A bunch of modules, including polymorphic containers."
|
||||
version = "0.3.1-alpha"
|
||||
description = "A modular standard library focused on data structures."
|
||||
requires = "containers threads lwt"
|
||||
archive(byte) = "containers_thread.cma"
|
||||
archive(byte, plugin) = "containers_thread.cma"
|
||||
|
|
@ -19,8 +19,8 @@ package "thread" (
|
|||
)
|
||||
|
||||
package "string" (
|
||||
version = "0.3"
|
||||
description = "A bunch of modules, including polymorphic containers."
|
||||
version = "0.3.1-alpha"
|
||||
description = "A modular standard library focused on data structures."
|
||||
archive(byte) = "containers_string.cma"
|
||||
archive(byte, plugin) = "containers_string.cma"
|
||||
archive(native) = "containers_string.cmxa"
|
||||
|
|
@ -29,8 +29,8 @@ package "string" (
|
|||
)
|
||||
|
||||
package "misc" (
|
||||
version = "0.3"
|
||||
description = "A bunch of modules, including polymorphic containers."
|
||||
version = "0.3.1-alpha"
|
||||
description = "A modular standard library focused on data structures."
|
||||
requires = "unix containers"
|
||||
archive(byte) = "containers_misc.cma"
|
||||
archive(byte, plugin) = "containers_misc.cma"
|
||||
|
|
@ -40,8 +40,8 @@ package "misc" (
|
|||
)
|
||||
|
||||
package "lwt" (
|
||||
version = "0.3"
|
||||
description = "A bunch of modules, including polymorphic containers."
|
||||
version = "0.3.1-alpha"
|
||||
description = "A modular standard library focused on data structures."
|
||||
requires = "containers lwt lwt.unix containers.misc"
|
||||
archive(byte) = "containers_lwt.cma"
|
||||
archive(byte, plugin) = "containers_lwt.cma"
|
||||
|
|
@ -51,8 +51,8 @@ package "lwt" (
|
|||
)
|
||||
|
||||
package "cgi" (
|
||||
version = "0.3"
|
||||
description = "A bunch of modules, including polymorphic containers."
|
||||
version = "0.3.1-alpha"
|
||||
description = "A modular standard library focused on data structures."
|
||||
requires = "containers CamlGI"
|
||||
archive(byte) = "containers_cgi.cma"
|
||||
archive(byte, plugin) = "containers_cgi.cma"
|
||||
|
|
|
|||
13
setup.ml
13
setup.ml
|
|
@ -1,7 +1,7 @@
|
|||
(* setup.ml generated for the first time by OASIS v0.4.4 *)
|
||||
|
||||
(* OASIS_START *)
|
||||
(* DO NOT EDIT (digest: 4ada3be2c7f1b78d0a6742ac05a3203d) *)
|
||||
(* DO NOT EDIT (digest: af57fb786b958cce0ff1ad15f9c9c1c6) *)
|
||||
(*
|
||||
Regenerated by OASIS v0.4.4
|
||||
Visit http://oasis.forge.ocamlcore.org for more information and
|
||||
|
|
@ -6856,7 +6856,7 @@ let setup_t =
|
|||
alpha_features = [];
|
||||
beta_features = [];
|
||||
name = "containers";
|
||||
version = "0.3";
|
||||
version = "0.3.1-alpha";
|
||||
license =
|
||||
OASISLicense.DEP5License
|
||||
(OASISLicense.DEP5Unit
|
||||
|
|
@ -6870,12 +6870,12 @@ let setup_t =
|
|||
maintainers = [];
|
||||
authors = ["Simon Cruanes"];
|
||||
homepage = Some "https://github.com/c-cube/ocaml-containers";
|
||||
synopsis = "A bunch of modules, including polymorphic containers.";
|
||||
synopsis = "A modular standard library focused on data structures.";
|
||||
description =
|
||||
Some
|
||||
[
|
||||
OASISText.Para
|
||||
"A bunch of useful modules, including polymorphic containers, graph abstractions, serialization systems, testing systems and various experiments."
|
||||
"Containers is a standard library (BSD license) focused on data structures, combinators and iterators, without dependencies on unix. Every module is independent and is prefixed with 'CC' in the global namespace. Some modules extend the stdlib (e.g. CCList provides safe map/fold_right/append, and additional functions on lists). It also features an optional library for dealing with strings, and a `misc` library full of experimental ideas (not stable, not necessarily usable)."
|
||||
];
|
||||
categories = [];
|
||||
conf_type = (`Configure, "internal", Some "0.4");
|
||||
|
|
@ -7736,7 +7736,8 @@ let setup_t =
|
|||
};
|
||||
oasis_fn = Some "_oasis";
|
||||
oasis_version = "0.4.4";
|
||||
oasis_digest = Some "\167\b\207\220E\000\132i\189/}I|<\145\185";
|
||||
oasis_digest =
|
||||
Some "\222\021\175\246\227n\021L\206\022\182\224\189J\203\168";
|
||||
oasis_exec = None;
|
||||
oasis_setup_args = [];
|
||||
setup_update = false
|
||||
|
|
@ -7744,6 +7745,6 @@ let setup_t =
|
|||
|
||||
let setup () = BaseSetup.setup setup_t;;
|
||||
|
||||
# 7748 "setup.ml"
|
||||
# 7749 "setup.ml"
|
||||
(* OASIS_STOP *)
|
||||
let () = setup ();;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue