module Data.RedBlackTree.TreeFamily (
getTreeFamily,
TreeFamily (IsRoot, HasParent, HasGrandparent)
) where
import Data.RedBlackTree.BinaryTree
data TreeFamily a =
IsRoot (TreeBranch a) |
HasParent (TreeDirection a) (TreeBranch a) |
HasGrandparent (TreeDirections a) (TreeDirection a) (TreeDirection a)
(TreeBranch a)
getTreeFamily' :: (BinaryTreeNode a) => BranchZipper a -> TreeDirection a ->
TreeBranch a -> TreeFamily a
getTreeFamily' :: forall a.
BinaryTreeNode a =>
BranchZipper a -> TreeDirection a -> TreeBranch a -> TreeFamily a
getTreeFamily' (TreeBranch a
parentBranch, []) TreeDirection a
direction TreeBranch a
branch =
TreeDirection a -> TreeBranch a -> TreeFamily a
forall a. TreeDirection a -> TreeBranch a -> TreeFamily a
HasParent TreeDirection a
direction TreeBranch a
branch
getTreeFamily' (TreeBranch a
_, TreeDirection a
grandparentDirection:TreeDirections a
xs) TreeDirection a
parentDirection TreeBranch a
branch =
TreeDirections a
-> TreeDirection a
-> TreeDirection a
-> TreeBranch a
-> TreeFamily a
forall a.
TreeDirections a
-> TreeDirection a
-> TreeDirection a
-> TreeBranch a
-> TreeFamily a
HasGrandparent TreeDirections a
xs TreeDirection a
grandparentDirection TreeDirection a
parentDirection TreeBranch a
branch
getTreeFamily :: (BinaryTreeNode a) => BranchZipper a -> TreeFamily a
getTreeFamily :: forall a. BinaryTreeNode a => BranchZipper a -> TreeFamily a
getTreeFamily (TreeBranch a
branch, []) = TreeBranch a -> TreeFamily a
forall a. TreeBranch a -> TreeFamily a
IsRoot TreeBranch a
branch
getTreeFamily (TreeBranch a
branch, TreeDirection a
direction:TreeDirections a
xs) =
(TreeBranch a, TreeDirections a)
-> TreeDirection a -> TreeBranch a -> TreeFamily a
forall a.
BinaryTreeNode a =>
BranchZipper a -> TreeDirection a -> TreeBranch a -> TreeFamily a
getTreeFamily' (TreeBranch a, TreeDirections a)
parentZipper TreeDirection a
direction TreeBranch a
branch
where parentBranch :: TreeBranch a
parentBranch = TreeBranch a -> TreeDirection a -> TreeBranch a
forall a.
BinaryTreeNode a =>
TreeBranch a -> TreeDirection a -> TreeBranch a
reconstructAncestor TreeBranch a
branch TreeDirection a
direction
parentZipper :: (TreeBranch a, TreeDirections a)
parentZipper = (TreeBranch a
parentBranch, TreeDirections a
xs)