{-# OPTIONS --no-positivity-check #-}
module Data.Braun where
open import Prelude hiding (_⟨_⟩_)
open import Data.Binary hiding (_+_)
open import Data.Nat using (_+_)
record Q (A : Type a) : Type a where
inductive
field q : (Q A → Q A) → (Q A → Q A) → A → A
open Q
data Tree (A : Type a) : Type a where
⟨⟩ : Tree A
⟨_,_,_⟩ : (x : A) → (s : Tree A) → (t : Tree A) → Tree A
diff : Tree A → 𝔹 → Bool
diff ⟨⟩ _ = false
diff ⟨ _ , _ , _ ⟩ 0ᵇ = true
diff ⟨ x , s , t ⟩ (1ᵇ k) = diff s k
diff ⟨ x , s , t ⟩ (2ᵇ k) = diff t k
size : Tree A → 𝔹
size ⟨⟩ = 0ᵇ
size ⟨ _ , s , t ⟩ = let m = size t in (if diff s m then 2ᵇ_ else 1ᵇ_) m
module _ {A : Type a} {B : Type b} where
{-# TERMINATING #-}
foldr𝔹 : (A → B → B) → B → Tree A → B
foldr𝔹 c n t = f t r .q id id n
where
f : Tree A → Q B → Q B
f ⟨⟩ xs .q ls rs b = b
f ⟨ x , l , r ⟩ xs .q ls rs b = c x (xs .q (ls ∘ f l) (rs ∘ f r) b)
r : Q B
r .q ls rs = ls (rs r) .q id id
infixr 5 _◂_
record Stream (A : Type a) : Type a where
coinductive; constructor _◂_
field
head : A
tail : Stream A
open Stream public
open import Data.List
TreeBuilder : Type a → Type a
TreeBuilder A = ℕ → ℕ → Stream (Stream (Tree A)) → Stream (Stream (Tree A))
repeat : A → Stream A
repeat x .head = x
repeat x .tail = repeat x
tnil : TreeBuilder A
tnil n m xs = repeat ⟨⟩ ◂ repeat ⟨⟩ ◂ xs
{-# NON_TERMINATING #-}
tl : (Stream (Stream (Tree A)) → Stream (Stream (Tree A))) → Stream (Tree A)
tl k = head xs
where
xs : Stream (Stream (Tree _))
xs = k (tail xs)
double : ℕ → ℕ
double n = n + n
2^ : ℕ → ℕ
2^ zero = 1
2^ (suc n) = double (2^ n)
head_ : (A → A) → Stream A → Stream A
head_ f xs .head = f (xs .head)
head_ f xs .tail = xs .tail
infixl 10 _[_] _⊢_
_⊢_ : Stream A → ℕ → Stream A
xs ⊢ zero = xs
xs ⊢ suc n = tail xs ⊢ n
_[_] : Stream A → ℕ → A
xs [ n ] = (xs ⊢ n) .head
{-# NON_TERMINATING #-}
tcons : A → TreeBuilder A → TreeBuilder A
tcons v k zero j xs = repeat ⟨⟩ ◂ tl (tcons v k (2^ j) (suc j)) ◂ xs
tcons v k (suc i) j xs = head_ (⟨ v , xs [ 0 ] [ 0 ] , xs [ 1 ] [ 0 ] ⟩ ◂_) (k i j ((xs [ 0 ]) .tail ◂ (xs [ 1 ]) .tail ◂ xs ⊢ 2))