+open Common
+
open Ocollection
(* assoc, also called map or dictionnary *)
-class virtual ['a,'b] oassoc =
+class virtual ['a,'b] oassoc =
object(o: 'o)
inherit ['a * 'b] ocollection
-
+
method virtual assoc: 'a -> 'b
method virtual delkey: 'a -> 'o
-
+
(* pre: must be in *)
- method replkey: ('a * 'b) -> 'o =
- fun (k,v) -> o#add (k,v)
+ method replkey: ('a * 'b) -> 'o =
+ fun (k,v) -> o#add (k,v)
(* pre: must not be in *)
(* method add: ('a * 'b) -> 'o = *)
- (* method virtual keys: 'a oset *)
+ (*
+ method keys =
+ List.map fst (o#tolist)
+ *)
+ method virtual keys: 'a list (* or 'a oset ? *)
- method find: 'a -> 'b = fun k ->
+ method find: 'a -> 'b = fun k ->
o#assoc k
- method haskey: 'a -> bool = fun k ->
- try (ignore(o#assoc k); true)
+ method find_opt: 'a -> 'b option = fun k ->
+ try
+ let res = o#assoc k in
+ Some res
+ with Not_found -> None
+
+ method haskey: 'a -> bool = fun k ->
+ try (ignore(o#assoc k); true)
with Not_found -> false
-
- method apply: 'a -> ('b -> 'b) -> 'o = fun k f ->
- let old = o#assoc k in
+
+ method apply: 'a -> ('b -> 'b) -> 'o = fun k f ->
+ let old = o#assoc k in
o#replkey (k, f old)
(* apply default, assoc_default, take in class parameters a default value *)
- method apply_with_default: 'a -> ('b -> 'b) -> (unit -> 'b) -> 'o =
- fun k f default ->
- let old =
+ method apply_with_default: 'a -> ('b -> 'b) -> (unit -> 'b) -> 'o =
+ fun k f default ->
+ let old =
try o#assoc k
with Not_found -> default ()
in
o#replkey (k, f old)
+ method apply_with_default2 = fun k f default ->
+ o#apply_with_default k f default +> ignore
+
+
end