\begin{code}
{-# OPTIONS --safe #-}
module Data.RoseTree where
open import Prelude
infixr 4.5 _&_
mutual
Forest : Type a → Type a
\end{code}
%<*forest-def>
\begin{code}
Forest A = List (Tree A)
\end{code}
%</forest-def>
\begin{code}
data Tree (A : Type a) : Type a
\end{code}
%<*tree-def>
\begin{code}
data Tree A where _&_ : A → Forest A → Tree A
\end{code}
%</tree-def>
\begin{code}
open Tree public
module _
(root : A → B → C)
(branch : C → B → B)
(leaf : B)
where
fold-tree : Tree A → C
fold-forest : Forest A → B
fold-tree (x & xs) = root x (fold-forest xs)
fold-forest [] = leaf
fold-forest (x ∷ xs) = branch (fold-tree x) (fold-forest xs)
\end{code}