0 | module Libraries.Data.VarSet.Core
4 | import Libraries.Data.NatSet
6 | import Core.Name.Scoped
9 | import Libraries.Data.List.SizeOf
15 | VarSet vars = NatSet
19 | empty = NatSet.empty
22 | elem : Var vs -> VarSet vs -> Bool
23 | elem (MkVar {varIdx} _) = NatSet.elem varIdx
26 | isEmpty : VarSet vs -> Bool
27 | isEmpty = NatSet.isEmpty
30 | size : VarSet vs -> Nat
34 | insert : Var vs -> VarSet vs -> VarSet vs
35 | insert (MkVar {varIdx} _) = NatSet.insert varIdx
38 | delete : Var vs -> VarSet vs -> VarSet vs
39 | delete (MkVar {varIdx} _) = NatSet.delete varIdx
42 | full : SizeOf vs -> VarSet vs
43 | full p = NatSet.allLessThan p.size
46 | intersection : VarSet vs -> VarSet vs -> VarSet vs
47 | intersection = NatSet.intersection
50 | union : VarSet vs -> VarSet vs -> VarSet vs
51 | union = NatSet.union
53 | export %inline %unsafe
54 | unsafeToList : VarSet vs -> List (Var vs)
55 | unsafeToList = believe_me NatSet.toList
58 | toList : {vs : Scope} -> VarSet vs -> List (Var vs)
59 | toList = mapMaybe (`isDeBruijn` vs) . NatSet.toList
65 | dropFirst : VarSet (v :: vs) -> VarSet vs
66 | dropFirst = NatSet.popZ
69 | dropInner : SizeOf inner -> VarSet (inner ++ vs) -> VarSet vs
70 | dropInner p = NatSet.popNs p.size
73 | varSetFreelyEmbeddable : FreelyEmbeddable VarSet
74 | varSetFreelyEmbeddable = MkFreelyEmbeddable id
77 | varSetWeaken : Weaken VarSet
78 | varSetWeaken = MkWeaken NatSet.addZ (\ inn, vs => cast (cast {to = Integer} vs `shiftL` inn.size))