lean4-htt/library/init/lean/kvmap.lean
2019-03-07 14:12:10 -08:00

94 lines
2.9 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
Copyright (c) 2018 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Leonardo de Moura
-/
prelude
import init.lean.name init.data.option.basic
namespace lean
inductive data_value
| of_string (v : string)
| of_nat (v : nat)
| of_bool (v : bool)
| of_name (v : name)
def data_value.beq : data_value → data_value → bool
| (data_value.of_string s₁) (data_value.of_string s₂) := s₁ = s₂
| (data_value.of_nat n₁) (data_value.of_nat n₂) := n₂ = n₂
| (data_value.of_bool b₁) (data_value.of_bool b₂) := b₁ = b₂
| _ _ := ff
instance data_value.has_beq : has_beq data_value := ⟨data_value.beq⟩
/- Remark: we do not use rbmap here because we need to manipulate kvmap objects in
C++ and rbmap is implemented in Lean. So, we use just a list until we can
generate C++ code from Lean code. -/
structure kvmap :=
(entries : list (name × data_value) := [])
namespace kvmap
def find_core : list (name × data_value) → name → option data_value
| [] k' := none
| ((k,v)::m) k' := if k = k' then some v else find_core m k'
def find : kvmap → name → option data_value
| ⟨m⟩ k := find_core m k
def insert_core : list (name × data_value) → name → data_value → list (name × data_value)
| [] k' v' := [(k',v')]
| ((k,v)::m) k' v' := if k = k' then (k, v') :: m else (k, v) :: insert_core m k' v'
def insert : kvmap → name → data_value → kvmap
| ⟨m⟩ k v := ⟨insert_core m k v⟩
def contains (m : kvmap) (n : name) : bool :=
(m.find n).is_some
def get_string (m : kvmap) (k : name) : option string :=
match m.find k with
| some (data_value.of_string v) := some v
| _ := none
def get_nat (m : kvmap) (k : name) : option nat :=
match m.find k with
| some (data_value.of_nat v) := some v
| _ := none
def get_bool (m : kvmap) (k : name) : option bool :=
match m.find k with
| some (data_value.of_bool v) := some v
| _ := none
def get_name (m : kvmap) (k : name) : option name :=
match m.find k with
| some (data_value.of_name v) := some v
| _ := none
def set_string (m : kvmap) (k : name) (v : string) : kvmap :=
m.insert k (data_value.of_string v)
def set_nat (m : kvmap) (k : name) (v : nat) : kvmap :=
m.insert k (data_value.of_nat v)
def set_bool (m : kvmap) (k : name) (v : bool) : kvmap :=
m.insert k (data_value.of_bool v)
def set_name (m : kvmap) (k : name) (v : name) : kvmap :=
m.insert k (data_value.of_name v)
def subset : kvmap → kvmap → bool
| ⟨[]⟩ m₂ := tt
| ⟨(k, v₁)::m₁⟩ m₂ :=
(match m₂.find k with
| some v₂ := v₁ == v₂ && subset ⟨m₁⟩ m₂
| none := ff)
def eqv (m₁ m₂ : kvmap) : bool :=
subset m₁ m₂ && subset m₂ m₁
instance : has_beq kvmap := ⟨eqv⟩
end kvmap
end lean