aboutsummaryrefslogtreecommitdiffhomepage
path: root/clib
diff options
context:
space:
mode:
authorGravatar Hugo Herbelin <Hugo.Herbelin@inria.fr>2018-05-23 13:34:46 +0200
committerGravatar Hugo Herbelin <Hugo.Herbelin@inria.fr>2018-05-23 18:50:10 +0200
commit33b5074f24270c202a9922f21d445c12cc6b3b3d (patch)
tree67d69b51caf3b7849e2d90d21e6ed7dc705d3249 /clib
parent944f62d08b7d78bcb20dd12ba138891d432b5987 (diff)
Collecting List.smart_* functions into a module List.Smart.
Diffstat (limited to 'clib')
-rw-r--r--clib/cList.ml48
-rw-r--r--clib/cList.mli17
2 files changed, 45 insertions, 20 deletions
diff --git a/clib/cList.ml b/clib/cList.ml
index 8727f4696..7621793d4 100644
--- a/clib/cList.ml
+++ b/clib/cList.ml
@@ -39,6 +39,7 @@ sig
val map_filter_i : (int -> 'a -> 'b option) -> 'a list -> 'b list
val filter_with : bool list -> 'a list -> 'a list
val smartmap : ('a -> 'a) -> 'a list -> 'a list
+ [@@ocaml.deprecated "Same as [Smart.map]"]
val map_left : ('a -> 'b) -> 'a list -> 'b list
val map_i : (int -> 'a -> 'b) -> int -> 'a list -> 'b list
val map2_i :
@@ -53,6 +54,7 @@ sig
(int -> 'a -> bool) -> 'a list -> 'a list * 'a list
val map_of_array : ('a -> 'b) -> 'a array -> 'b list
val smartfilter : ('a -> bool) -> 'a list -> 'a list
+ [@@ocaml.deprecated "Same as [Smart.map]"]
val extend : bool list -> 'a -> 'a list -> 'a list
val count : ('a -> bool) -> 'a list -> int
val index : 'a eq -> 'a -> 'a list -> int
@@ -117,6 +119,12 @@ sig
('a -> 'b -> 'b option) -> 'b -> 'a list list -> 'b list
val factorize_left : 'a eq -> ('a * 'b) list -> ('a * 'b list) list
+ module Smart :
+ sig
+ val map : ('a -> 'a) -> 'a list -> 'a list
+ val filter : ('a -> bool) -> 'a list -> 'a list
+ end
+
module type MonoS = sig
type elt
val equal : elt list -> elt list -> bool
@@ -365,13 +373,6 @@ let assign l n e =
in
assrec [] l n
-let rec smartmap f l = match l with
- [] -> l
- | h::tl ->
- let h' = f h and tl' = smartmap f tl in
- if h'==h && tl'==tl then l
- else h'::tl'
-
let map_left = map
let map2_i f i l1 l2 =
@@ -398,15 +399,6 @@ let map4 f l1 l2 l3 l4 =
in
map (l1,l2,l3,l4)
-let rec smartfilter f l = match l with
- [] -> l
- | h::tl ->
- let tl' = smartfilter f tl in
- if f h then
- if tl' == tl then l
- else h :: tl'
- else tl'
-
let rec extend l a l' = match l,l' with
| true::l, b::l' -> b :: extend l a l'
| false::l, l' -> a :: extend l a l'
@@ -896,6 +888,30 @@ let rec factorize_left cmp = function
(a,(b::List.map snd al)) :: factorize_left cmp l'
| [] -> []
+module Smart =
+struct
+
+ let rec map f l = match l with
+ [] -> l
+ | h::tl ->
+ let h' = f h and tl' = map f tl in
+ if h'==h && tl'==tl then l
+ else h'::tl'
+
+ let rec filter f l = match l with
+ [] -> l
+ | h::tl ->
+ let tl' = filter f tl in
+ if f h then
+ if tl' == tl then l
+ else h :: tl'
+ else tl'
+
+end
+
+let smartmap = Smart.map
+let smartfilter = Smart.filter
+
module type MonoS = sig
type elt
val equal : elt list -> elt list -> bool
diff --git a/clib/cList.mli b/clib/cList.mli
index fd6d6a158..b3c151098 100644
--- a/clib/cList.mli
+++ b/clib/cList.mli
@@ -75,8 +75,7 @@ sig
[b] is [true]. Raise [Invalid_argument _] when sizes differ. *)
val smartmap : ('a -> 'a) -> 'a list -> 'a list
- (** [smartmap f [a1...an] = List.map f [a1...an]] but if for all i
- [f ai == ai], then [smartmap f l == l] *)
+ [@@ocaml.deprecated "Same as [Smart.map]"]
val map_left : ('a -> 'b) -> 'a list -> 'b list
(** As [map] but ensures the left-to-right order of evaluation. *)
@@ -97,8 +96,7 @@ sig
(** [map_of_array f a] behaves as [List.map f (Array.to_list a)] *)
val smartfilter : ('a -> bool) -> 'a list -> 'a list
- (** [smartfilter f [a1...an] = List.filter f [a1...an]] but if for all i
- [f ai = true], then [smartfilter f l == l] *)
+ [@@ocaml.deprecated "Same as [Smart.filter]"]
val extend : bool list -> 'a -> 'a list -> 'a list
(** [extend l a [a1..an]] assumes that the number of [true] in [l] is [n];
@@ -258,6 +256,17 @@ sig
val factorize_left : 'a eq -> ('a * 'b) list -> ('a * 'b list) list
+ module Smart :
+ sig
+ val map : ('a -> 'a) -> 'a list -> 'a list
+ (** [Smart.map f [a1...an] = List.map f [a1...an]] but if for all i
+ [f ai == ai], then [Smart.map f l == l] *)
+
+ val filter : ('a -> bool) -> 'a list -> 'a list
+ (** [Smart.filter f [a1...an] = List.filter f [a1...an]] but if for all i
+ [f ai = true], then [Smart.filter f l == l] *)
+ end
+
module type MonoS = sig
type elt
val equal : elt list -> elt list -> bool