94 lines
2.9 KiB
Text
94 lines
2.9 KiB
Text
/-
|
||
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
|