Check argument to 'unset' in reactive mode
[hiphop-php.git] / hphp / hack / src / hhbc / unique_list.ml
blob887144476e18ed346ef3337dd527e5aa37aced99
1 (**
2 * Copyright (c) 2017, Facebook, Inc.
3 * All rights reserved.
5 * This source code is licensed under the MIT license found in the
6 * LICENSE file in the "hack" directory of this source tree.
8 *)
10 module WithValue(Value: Set.OrderedType) = struct
11 module ValueSet = Set.Make (Value)
12 type t = {
13 unique_set : ValueSet.t;
14 unique_list : Value.t list
17 let empty = { unique_set = ValueSet.empty; unique_list = [] }
19 let add uniq_set item =
20 if ValueSet.mem item uniq_set.unique_set then
21 uniq_set
22 else
24 unique_set = (ValueSet.add item uniq_set.unique_set);
25 unique_list = item :: uniq_set.unique_list
28 let items uniq_set =
29 List.rev uniq_set.unique_list
31 let items_set uniq_set =
32 uniq_set.unique_set
34 let remove item uniq_set =
35 if ValueSet.mem item uniq_set.unique_set then
37 unique_set = (ValueSet.remove item uniq_set.unique_set);
38 unique_list = List.filter (fun a -> a <> item) uniq_set.unique_list
40 else
41 uniq_set
43 let diff s1 s2 =
44 ValueSet.fold remove s2.unique_set s1
46 let cardinal uniq_set = ValueSet.cardinal uniq_set.unique_set
47 end