0 | module Data.Container.Applicative.TreeUtils
3 | import Data.Container.Base
9 | data RoseTreeShape : (c : Cont) -> TensorMonoid c => Type where
10 | LeafS : TensorMonoid c => RoseTreeShape c
11 | NodeS : TensorMonoid c => c `fullOf` (RoseTreeShape c) -> RoseTreeShape c
14 | numLeaves : TensorMonoid c => Foldable (Ext c) => RoseTreeShape c -> Nat
16 | numLeaves (NodeS exts) = sum (numLeaves <$> exts)
19 | numNodes : TensorMonoid c => Foldable (Ext c) => RoseTreeShape c -> Nat
21 | numNodes (NodeS exts) = 1 + sum (numNodes <$> exts)
23 | namespace NodesAndLeaves
27 | (c : Cont) -> TensorMonoid c => RoseTreeShape c -> Type where
28 | AtLeaf : TensorMonoid c => RoseTreePos c LeafS
29 | AtNode : TensorMonoid c => {ts : c `fullOf` (RoseTreeShape c)} ->
30 | RoseTreePos c (NodeS ts)
31 | SubTree : TensorMonoid c => {ts : c `fullOf` (RoseTreeShape c)} ->
32 | (ps : c.Pos (shapeExt ts)) ->
33 | RoseTreePos c (index ts ps) ->
34 | RoseTreePos c (NodeS ts)
39 | data RoseTreePosNode :
40 | (c : Cont) -> TensorMonoid c => RoseTreeShape c -> Type where
41 | AtNode : TensorMonoid c => {ts : c `fullOf` (RoseTreeShape c)} ->
42 | RoseTreePosNode c (NodeS ts)
43 | SubTree : TensorMonoid c => {ts : c `fullOf` (RoseTreeShape c)} ->
44 | (ps : c.Pos (shapeExt ts)) ->
45 | RoseTreePosNode c (index ts ps) ->
46 | RoseTreePosNode c (NodeS ts)
50 | data RoseTreePosLeaf :
51 | (c : Cont) -> TensorMonoid c => RoseTreeShape c -> Type where
52 | AtLeaf : TensorMonoid c => RoseTreePosLeaf c LeafS
53 | SubTree : TensorMonoid c => {ts : c `fullOf` (RoseTreeShape c)} ->
54 | (ps : c.Pos (shapeExt ts)) ->
55 | RoseTreePosLeaf c (index ts ps) ->
56 | RoseTreePosLeaf c (NodeS ts)