117
117
(* All the tools above are implemented with this function based on ephemerons
118
118
(see the standard module Ephemeron.K1): *)
119
val weakly_memoize : ?equality:('a -> 'a -> bool) (* (=) *) -> ?size:int (* 0 *) -> ('a -> 'b) -> 'a -> 'b
119
val weakly_memoize : ?equality:('a -> 'a -> bool) (* (=) *) -> ?size:int (* 0 *) -> ('a -> 'b) -> 'a -> 'b
121
(* Variant with a projection function that prevent collection of 'a arguments. This may be useful to memoize functions with
122
several arguments. Because these functions must be uncurried before to be memoized, their arguments are probably built
123
only to call the function, then unused and collected.
126
(* val tool : string -> string list -> string *)
127
let tool = String.concat
129
(* val memoised_tool : string -> string list -> string *)
131
let uncurried (sep, xs) = tool sep xs in
132
let equality (sep1, xs1) (sep2, xs2) = (sep1 = sep2) && (xs1 == xs2) in
133
let memo = Extreme_sharing.weakly_memoize_with_prj ~trace_faults:() ~equality ~prj:(snd) (uncurried) in
134
fun sep xs -> memo (sep, xs)
136
let r = memoised_tool ":" ["/bin"; "/usr/bin"; "/usr/local/bin"] ;;
137
(* Extreme_sharing: weakly_memoize_with_prj: FAULT *)
138
(* val r : string = "/bin:/usr/bin:/usr/local/bin" *)
140
let dirs = ["/bin";"/usr/bin";"/usr/local/bin"] ;;
142
let r = memoised_tool ":" dirs ;;
143
(* Extreme_sharing: weakly_memoize_with_prj: FAULT *)
144
(* val r : string = "/bin:/usr/bin:/usr/local/bin" *)
146
let r = memoised_tool ":" dirs ;;
147
(* val r : string = "/bin:/usr/bin:/usr/local/bin" *)
149
val weakly_memoize_with_prj : ?trace_faults:unit -> ?equality:('a -> 'a -> bool) (* (=) *) -> ?size:int (* 0 *) -> prj:('a -> 'c) -> ('a -> 'b) -> 'a -> 'b
121
152
(* ------------------------------------ *)
122
153
(* Facilities for arrays' *)