{-# 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