This is just a draft. ``` for f in `find . -name '*.lean'`; do echo $f; gsed "/^import/s/\b\(.\)/\u\1/g" $f > tmp; gsed "/^Import/s/Import/import/g" tmp > $f; done ```
50 lines
1.5 KiB
Text
50 lines
1.5 KiB
Text
/-
|
||
Copyright (c) 2019 Microsoft Corporation. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Author: Leonardo de Moura
|
||
-/
|
||
prelude
|
||
import Init.Control.Id
|
||
universes u v w
|
||
|
||
/- List-like type to avoid extra level of indirection -/
|
||
inductive AssocList (α : Type u) (β : Type v)
|
||
| nil {} : AssocList
|
||
| cons (key : α) (value : β) (tail : AssocList) : AssocList
|
||
|
||
namespace AssocList
|
||
variables {α : Type u} {β : Type v} {δ : Type w} {m : Type w → Type w} [Monad m]
|
||
|
||
def empty : AssocList α β :=
|
||
nil
|
||
|
||
@[specialize] def mfoldl (f : δ → α → β → m δ) : δ → AssocList α β → m δ
|
||
| d, nil => pure d
|
||
| d, cons a b es => do d ← f d a b; mfoldl d es
|
||
|
||
@[inline] def foldl (f : δ → α → β → δ) (d : δ) (as : AssocList α β) : δ :=
|
||
Id.run (mfoldl f d as)
|
||
|
||
def find [HasBeq α] (a : α) : AssocList α β → Option β
|
||
| nil => none
|
||
| cons k v es => match k == a with
|
||
| true => some v
|
||
| false => find es
|
||
|
||
def contains [HasBeq α] (a : α) : AssocList α β → Bool
|
||
| nil => false
|
||
| cons k v es => k == a || contains es
|
||
|
||
def replace [HasBeq α] (a : α) (b : β) : AssocList α β → AssocList α β
|
||
| nil => nil
|
||
| cons k v es => match k == a with
|
||
| true => cons a b es
|
||
| false => cons k v (replace es)
|
||
|
||
def erase [HasBeq α] (a : α) : AssocList α β → AssocList α β
|
||
| nil => nil
|
||
| cons k v es => match k == a with
|
||
| true => es
|
||
| false => cons k v (erase es)
|
||
|
||
end AssocList
|