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