95 lines
2.8 KiB
Text
95 lines
2.8 KiB
Text
/-
|
||
Copyright (c) 2017 Microsoft Corporation. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Authors: Leonardo de Moura
|
||
-/
|
||
prelude
|
||
import init.data.rbmap.basic
|
||
universes u v w
|
||
|
||
def RBTree (α : Type u) (lt : α → α → Bool) : Type u :=
|
||
RBMap α Unit lt
|
||
|
||
@[inline] def mkRBTree (α : Type u) (lt : α → α → Bool) : RBTree α lt :=
|
||
mkRBMap α Unit lt
|
||
|
||
instance (α : Type u) (lt : α → α → Bool) : HasEmptyc (RBTree α lt) :=
|
||
⟨mkRBTree α lt⟩
|
||
|
||
namespace RBTree
|
||
variables {α : Type u} {β : Type v} {lt : α → α → Bool}
|
||
|
||
@[inline] def empty : RBTree α lt :=
|
||
RBMap.empty
|
||
|
||
@[inline] def depth (f : Nat → Nat → Nat) (t : RBTree α lt) : Nat :=
|
||
RBMap.depth f t
|
||
|
||
@[inline] def fold (f : β → α → β) (b : β) (t : RBTree α lt) : β :=
|
||
RBMap.fold (fun r a _ => f r a) b t
|
||
|
||
@[inline] def revFold (f : β → α → β) (b : β) (t : RBTree α lt) : β :=
|
||
RBMap.revFold (fun r a _ => f r a) b t
|
||
|
||
@[inline] def mfold {m : Type v → Type w} [Monad m] (f : β → α → m β) (b : β) (t : RBTree α lt) : m β :=
|
||
RBMap.mfold (fun r a _ => f r a) b t
|
||
|
||
@[inline] def mfor {m : Type v → Type w} [Monad m] (f : α → m β) (t : RBTree α lt) : m PUnit :=
|
||
t.mfold (fun _ a => f a *> pure ⟨⟩) ⟨⟩
|
||
|
||
@[inline] def isEmpty (t : RBTree α lt) : Bool :=
|
||
RBMap.isEmpty t
|
||
|
||
@[specialize] def toList (t : RBTree α lt) : List α :=
|
||
t.revFold (fun as a => a::as) []
|
||
|
||
@[inline] protected def min (t : RBTree α lt) : Option α :=
|
||
match RBMap.min t with
|
||
| some ⟨a, _⟩ => some a
|
||
| none => none
|
||
|
||
@[inline] protected def max (t : RBTree α lt) : Option α :=
|
||
match RBMap.max t with
|
||
| some ⟨a, _⟩ => some a
|
||
| none => none
|
||
|
||
instance [HasRepr α] : HasRepr (RBTree α lt) :=
|
||
⟨fun t => "rbtreeOf " ++ repr t.toList⟩
|
||
|
||
@[inline] def insert (t : RBTree α lt) (a : α) : RBTree α lt :=
|
||
RBMap.insert t a ()
|
||
|
||
@[inline] def erase (t : RBTree α lt) (a : α) : RBTree α lt :=
|
||
RBMap.erase t a
|
||
|
||
@[specialize] def ofList : List α → RBTree α lt
|
||
| [] := mkRBTree _ _
|
||
| (x::xs) := (ofList xs).insert x
|
||
|
||
@[inline] def find (t : RBTree α lt) (a : α) : Option α :=
|
||
match RBMap.findCore t a with
|
||
| some ⟨a, _⟩ => some a
|
||
| none => none
|
||
|
||
@[inline] def contains (t : RBTree α lt) (a : α) : Bool :=
|
||
(t.find a).isSome
|
||
|
||
def fromList (l : List α) (lt : α → α → Bool) : RBTree α lt :=
|
||
l.foldl insert (mkRBTree α lt)
|
||
|
||
@[inline] def all (t : RBTree α lt) (p : α → Bool) : Bool :=
|
||
RBMap.all t (fun a _ => p a)
|
||
|
||
@[inline] def any (t : RBTree α lt) (p : α → Bool) : Bool :=
|
||
RBMap.any t (fun a _ => p a)
|
||
|
||
def subset (t₁ t₂ : RBTree α lt) : Bool :=
|
||
t₁.all $ fun a => (t₂.find a).toBool
|
||
|
||
def seteq (t₁ t₂ : RBTree α lt) : Bool :=
|
||
subset t₁ t₂ && subset t₂ t₁
|
||
|
||
end RBTree
|
||
|
||
def rbtreeOf {α : Type u} (l : List α) (lt : α → α → Bool) : RBTree α lt :=
|
||
RBTree.fromList l lt
|