lean4-htt/library/init/lean/kvmap.lean
Leonardo de Moura a49de9ccd3 feat(library/init/lean): add kvmap
We use it to implement `expr.mdata` and `options`
2018-06-15 16:05:11 -07:00

74 lines
2.2 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)
/- 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)
end kvmap
end lean