File: maps.ml

package info (click to toggle)
js-of-ocaml 6.2.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 37,932 kB
  • sloc: ml: 135,957; javascript: 58,364; ansic: 437; makefile: 422; sh: 12; perl: 4
file content (75 lines) | stat: -rw-r--r-- 2,192 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
(* TEST *)

module IntMap = Map.Make(struct type t = int let compare x y = x-y end)

let m1 = IntMap.add 0 "A" (IntMap.add 4 "Y" (IntMap.singleton 3 "X1"))
let m2 = IntMap.add 0 "B" (IntMap.add 4 "Y" (IntMap.singleton 5 "X2"))

let show m = IntMap.iter (fun k v -> Printf.printf "%d %s\n" k v) m

let () =
  print_endline "Union+concat";
  let f1 _ l r =
    match l, r with
    | Some x, None | None, Some x -> Some x
    | Some x, Some y when x = y -> None
    | Some x, Some y -> Some (x ^ y)
    | _ -> assert false
  in
  show (IntMap.merge f1 m1 m2);

  print_endline "Inter";
  let f2 _ l r =
    match l, r with
    | Some x, Some y when x = y -> Some x
    | _ -> None
  in
  show (IntMap.merge f2 m1 m2);

  print_endline "Union+concat (with Map.union)";
  let f3 _ l r = if l = r then None else Some (l ^ r) in
  show (IntMap.union f3 m1 m2);
  ()

let show m = IntMap.iter (fun k v -> Printf.printf "%d -> %d\n" k v) m

let update x f m =
  let yp = IntMap.find_opt x m in
  let y = f yp in
  match yp, y with
  | _, None -> IntMap.remove x m
  | None, Some z -> IntMap.add x z m
  | Some zp, Some z -> if zp == z then m else IntMap.add x z m

let () =
  print_endline "Update";
  let rec init m  = function
    | -1 -> m
    | n -> init (IntMap.add n n m) (n - 1)
  in
  let n = 9 in
  let m = init IntMap.empty n in
  for i = 0 to n + 1 do
    for j = 0 to n + 1 do
      List.iter (function (k, f) ->
          let m1 = update i f m in
          let m2 = IntMap.update i f m in
          if not (IntMap.equal ( = ) m1 m2 && ((m1 == m) = (m2 == m))) then
          begin
            Printf.printf "ERROR: %s: %d -> %d\n" k i j;
            print_endline "expected result:";
            show m1;
            print_endline "result:";
            show m2;
          end
        )
      [
        "replace",                 (function None -> None   | Some _ -> Some j);
        "delete if exists, bind otherwise",
                                   (function None -> Some j | Some _ -> None);
        "delete",                  (function None -> None   | Some _ -> None);
        "insert",                  (function None -> Some j | Some _ -> Some j);
      ]
    done;
  done;
;;