From 0ed3c70669b4f4393981979793b60557d7303ae0 Mon Sep 17 00:00:00 2001 From: Jacques-Pascal Deplaix Date: Tue, 7 Nov 2017 12:11:41 +0100 Subject: [PATCH 1/2] Fix CCTrie.Make: Remove polymorphic comparison --- src/data/CCTrie.ml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/data/CCTrie.ml b/src/data/CCTrie.ml index 4b4b60e5..78e2f3c1 100644 --- a/src/data/CCTrie.ml +++ b/src/data/CCTrie.ml @@ -593,6 +593,13 @@ module Make(W : WORD) in List.iter (explore ~dir k) l' + let _list_eq l1 l2 = + try List.for_all2 (fun x y -> W.compare x y = 0) l1 l2 + with Invalid_argument _ -> false + + let _key_to_list key = + List.rev (_seq_append_list_rev [] (W.to_seq key)) + (* range above (if [above = true]) or below a threshold . [p c c'] must return [true] if [c'], in the tree, meets some criterion w.r.t [c] which is a part of the key. *) @@ -646,7 +653,7 @@ module Make(W : WORD) _iter_prefix ~prefix (fun key' v -> k (key', v)) t | Some (Node (Some v, _), prefix), Below -> (* yield the value for key *) - assert (W.of_list (prefix []) = key); + assert (_list_eq (prefix []) (_key_to_list key)); k (key, v) | Some _, _ | None, _ -> () From 3d27bd285e0fe5d705391b188ba0b528dfc00b53 Mon Sep 17 00:00:00 2001 From: Jacques-Pascal Deplaix Date: Tue, 7 Nov 2017 18:08:38 +0100 Subject: [PATCH 2/2] Add a regression test --- src/data/CCTrie.ml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/data/CCTrie.ml b/src/data/CCTrie.ml index 78e2f3c1..d7f8b9f7 100644 --- a/src/data/CCTrie.ml +++ b/src/data/CCTrie.ml @@ -680,6 +680,21 @@ module Make(W : WORD) (T.below [1;1] t1 |> Sequence.to_list) *) + (* NOTE: Regression test. See #158 *) + (*$T + let module TPoly = Make (struct \ + type t = (unit -> char) list \ + type char_ = char \ + let compare = compare \ + let to_seq a k = List.iter (fun c -> k (c ())) a \ + let of_list l = List.map (fun c -> (fun () -> c)) l \ + end) \ + in \ + let trie = TPoly.of_list [[fun () -> 'a'], 1; [fun () -> 'b'], 2] in \ + ignore (TPoly.below [fun () -> 'a'] trie |> Sequence.to_list); \ + true + *) + (*$Q & ~count:30 Q.(list_of_size Gen.(0--100) (pair printable_string small_int)) (fun l -> \ let t = S.of_list l in \