feat(library/init/meta/rb_map): add rb_set and helper functions
This commit is contained in:
parent
c065faaf1f
commit
b1acaf50ee
1 changed files with 52 additions and 0 deletions
|
|
@ -52,6 +52,9 @@ fold m (mk _ _) $ λa b m', if f b then insert m' a b else m'
|
|||
|
||||
end rb_map
|
||||
|
||||
meta def mk_rb_map {key data : Type} [has_ordering key] : rb_map key data :=
|
||||
rb_map.mk key data
|
||||
|
||||
@[reducible] meta def nat_map (data : Type) := rb_map nat data
|
||||
namespace nat_map
|
||||
export rb_map (hiding mk)
|
||||
|
|
@ -59,6 +62,9 @@ export rb_map (hiding mk)
|
|||
meta def mk (data : Type) : nat_map data := rb_map.mk nat data
|
||||
end nat_map
|
||||
|
||||
meta def mk_nat_map {data : Type} : nat_map data :=
|
||||
nat_map.mk data
|
||||
|
||||
@[reducible] meta def name_map (data : Type) := rb_map name data
|
||||
namespace name_map
|
||||
export rb_map (hiding mk)
|
||||
|
|
@ -66,6 +72,9 @@ export rb_map (hiding mk)
|
|||
meta def mk (data : Type) : name_map data := rb_map.mk name data
|
||||
end name_map
|
||||
|
||||
meta def mk_name_map {data : Type} : name_map data :=
|
||||
name_map.mk data
|
||||
|
||||
@[reducible] meta def expr_map (data : Type) := rb_map expr data
|
||||
namespace expr_map
|
||||
export rb_map (hiding mk)
|
||||
|
|
@ -73,6 +82,9 @@ export rb_map (hiding mk)
|
|||
meta def mk (data : Type) : expr_map data := rb_map.mk expr data
|
||||
end expr_map
|
||||
|
||||
meta def mk_expr_map {data : Type} : expr_map data :=
|
||||
expr_map.mk data
|
||||
|
||||
open rb_map prod
|
||||
section
|
||||
open format
|
||||
|
|
@ -125,3 +137,43 @@ match (rb_map.find rbl k) with
|
|||
end
|
||||
|
||||
end rb_lmap
|
||||
|
||||
meta def rb_set (key) := rb_map key unit
|
||||
meta def mk_rb_set {key} [has_ordering key] : rb_set key :=
|
||||
mk_rb_map
|
||||
|
||||
namespace rb_set
|
||||
meta def insert {key} (s : rb_set key) (k : key) : rb_set key :=
|
||||
s^.insert k ()
|
||||
|
||||
meta def erase {key} (s : rb_set key) (k : key) : rb_set key :=
|
||||
s^.erase k
|
||||
|
||||
meta def contains {key} (s : rb_set key) (k : key) : bool :=
|
||||
s^.contains k
|
||||
|
||||
meta def size {key} (s : rb_set key) : nat :=
|
||||
s^.size
|
||||
|
||||
meta def fold {key α : Type} (s : rb_set key) (a : α) (fn : key → α → α) : α :=
|
||||
s^.fold a (λ k _ a, fn k a)
|
||||
|
||||
meta def to_list {key : Type} (s : rb_set key) : list key :=
|
||||
s^.fold [] list.cons
|
||||
|
||||
open format
|
||||
|
||||
private meta def format_key {key} [has_to_format key] (k : key) (first : bool) : format :=
|
||||
(if first then to_fmt "" else to_fmt "," ++ line) ++ to_fmt k
|
||||
|
||||
meta instance {key} [has_to_format key] : has_to_format (rb_set key) :=
|
||||
⟨λ m, group $ to_fmt "{" ++ nest 1 (fst (fold m (to_fmt "", tt) (λ k p, (fst p ++ format_key k (snd p), ff)))) ++
|
||||
to_fmt "}"⟩
|
||||
end rb_set
|
||||
|
||||
@[reducible] meta def name_set := rb_set name
|
||||
@[reducible] meta def expr_set := rb_set expr
|
||||
meta def mk_name_set : name_set := mk_rb_set
|
||||
meta def mk_expr_set : expr_set := mk_rb_set
|
||||
|
||||
vm_eval to_fmt $ (mk_name_set^.insert `a)^.insert `b
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue