{-# OPTIONS --cubical --safe #-}
open import Prelude
open import Algebra
module Data.FingerTree {ā} {š : Type ā} (mon : Monoid š) where
open Monoid mon
record Measured {a} (A : Type a) : Type (a āā ā) where
constructor measured
field μ : A ā š
open Measured ⦠... ⦠public
data Digit {a} (A : Type a) : Type a where
Dā : A ā Digit A
Dā : A ā A ā Digit A
Dā : A ā A ā A ā Digit A
data Node {a} (A : Type a) : Type a where
Nā : A ā A ā Node A
Nā : A ā A ā A ā Node A
instance
measuredDigit : ⦠_ : Measured A ⦠ā Measured (Digit A)
measuredDigit =
measured Ī» { (Dā x) ā μ x
; (Dā x xā) ā μ x ā μ xā
; (Dā x xā xā) ā μ x ā μ xā ā μ xā
}
instance
measuredNode : ⦠_ : Measured A ⦠ā Measured (Node A)
measuredNode =
measured Ī» { (Nā x xā) ā μ x ā μ xā
; (Nā x xā xā) ā μ x ā μ xā ā μ xā
}
record āŖ_ā« (A : Type a) ⦠_ : Measured A ⦠: Type (a āā ā) where
constructor recd
field
val : A
mem : š
prf : μ val ┠mem
open āŖ_ā« public
memo : ⦠_ : Measured A ⦠ā A ā āŖ A ā«
memo x = recd x (μ x) refl
instance
measuredMemo : ⦠_ : Measured A ⦠ā Measured āŖ A ā«
measuredMemo = measured mem
mutual
record Deep {a} (A : Type a) ⦠_ : Measured A ⦠: Type (a āā ā) where
pattern
constructor more
inductive
field
lbuff : Digit A
tree : Tree āŖ Node A ā«
rbuff : Digit A
data Tree {a} (A : Type a) ⦠_ : Measured A ⦠: Type (a āā ā) where
empty : Tree A
single : A ā Tree A
deep : āŖ Deep A ā« ā Tree A
μ-deep : ā {a} {A : Type a} ⦠_ : Measured A ⦠ā Deep A ā š
μ-deep (more l x r) = μ l ā (μ-tree x ā μ r)
μ-tree : ā {a} {A : Type a} ⦠_ : Measured A ⦠ā Tree A ā š
μ-tree empty = ε
μ-tree (single x) = μ x
μ-tree (deep xs) = xs .mem
instance
Measured-Deep : ā {a} {A : Type a} ā ⦠_ : Measured A ⦠ā Measured (Deep A)
Measured-Deep = measured μ-deep
instance
Measured-Tree : ā {a} {A : Type a} ā ⦠_ : Measured A ⦠ā Measured (Tree A)
Measured-Tree = measured μ-tree
open Deep