Naposledy aktivní 2 hours ago

properties.ml Raw Playground
1module Univ = struct
2 type t = ..
3 let id =
4 let id = ref 0 in
5 fun () ->
6 incr id ;
7 !id
8
9 module Embed (M : sig type t end) = struct
10 type t += E of M.t
11 let wrap m = E m
12 let read = function E m -> Some m | _ -> None
13
14 let new_property () =
15 let id = id () in
16 let set t v =
17 Hashtbl.replace t id @@ wrap v in
18 let get t =
19 Hashtbl.find_opt t id |> Fun.flip Option.bind read in
20 (set, get)
21 end
22end
23
24module IntWrapper = Univ.Embed(Int)
25module StringWrapper = Univ.Embed(String)
26
27let and_null = Hashtbl.create 16
28let or_watt = Hashtbl.create 16
29
30let name = StringWrapper.new_property ()
31let age = IntWrapper.new_property ()
32let money = IntWrapper.new_property ()
33
34let get t (set, get) = get t
35let set t (set, get) x = set t x
36
37let () = set and_null name "and Null"
38let () = set and_null age 28
39let () = set and_null money 20
40let () = set or_watt name "or Watt"
41let () = set or_watt age 28
42let () = set or_watt money 100