{-# LANGUAGE RecordWildCards #-} {-# LANGUAGE TypeFamilies #-} module Cursor.Tree.Delete ( treeCursorDeleteSubTreeAndSelectPrevious, treeCursorDeleteSubTreeAndSelectNext, treeCursorDeleteSubTreeAndSelectAbove, treeCursorRemoveSubTree, treeCursorDeleteSubTree, treeCursorDeleteElemAndSelectPrevious, treeCursorDeleteElemAndSelectNext, treeCursorDeleteElemAndSelectAbove, treeCursorRemoveElem, treeCursorDeleteElem, ) where import Control.Applicative import Cursor.Tree.Base import Cursor.Tree.Types import Cursor.Types import Data.List.NonEmpty (NonEmpty (..)) import qualified Data.List.NonEmpty as NE import Data.Tree treeCursorDeleteSubTreeAndSelectPrevious :: (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteSubTreeAndSelectPrevious :: (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteSubTreeAndSelectPrevious b -> a g TreeCursor {a Maybe (TreeAbove b) CForest b treeBelow :: forall a b. TreeCursor a b -> CForest b treeCurrent :: forall a b. TreeCursor a b -> a treeAbove :: forall a b. TreeCursor a b -> Maybe (TreeAbove b) treeBelow :: CForest b treeCurrent :: a treeAbove :: Maybe (TreeAbove b) ..} = case Maybe (TreeAbove b) treeAbove of Maybe (TreeAbove b) Nothing -> DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a. a -> Maybe a Just DeleteOrUpdate (TreeCursor a b) forall a. DeleteOrUpdate a Deleted Just TreeAbove b ta -> case TreeAbove b -> [CTree b] forall b. TreeAbove b -> [CTree b] treeAboveLefts TreeAbove b ta of [] -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a. Maybe a Nothing CTree b tree : [CTree b] xs -> DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a. a -> Maybe a Just (DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b))) -> (Maybe (TreeAbove b) -> DeleteOrUpdate (TreeCursor a b)) -> Maybe (TreeAbove b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall b c a. (b -> c) -> (a -> b) -> a -> c . TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) forall a. a -> DeleteOrUpdate a Updated (TreeCursor a b -> DeleteOrUpdate (TreeCursor a b)) -> (Maybe (TreeAbove b) -> TreeCursor a b) -> Maybe (TreeAbove b) -> DeleteOrUpdate (TreeCursor a b) forall b c a. (b -> c) -> (a -> b) -> a -> c . (b -> a) -> CTree b -> Maybe (TreeAbove b) -> TreeCursor a b forall b a. (b -> a) -> CTree b -> Maybe (TreeAbove b) -> TreeCursor a b makeTreeCursorWithAbove b -> a g CTree b tree (Maybe (TreeAbove b) -> Maybe (DeleteOrUpdate (TreeCursor a b))) -> Maybe (TreeAbove b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a b. (a -> b) -> a -> b $ TreeAbove b -> Maybe (TreeAbove b) forall a. a -> Maybe a Just TreeAbove b ta {treeAboveLefts :: [CTree b] treeAboveLefts = [CTree b] xs} treeCursorDeleteSubTreeAndSelectNext :: (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteSubTreeAndSelectNext :: (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteSubTreeAndSelectNext b -> a g TreeCursor {a Maybe (TreeAbove b) CForest b treeBelow :: CForest b treeCurrent :: a treeAbove :: Maybe (TreeAbove b) treeBelow :: forall a b. TreeCursor a b -> CForest b treeCurrent :: forall a b. TreeCursor a b -> a treeAbove :: forall a b. TreeCursor a b -> Maybe (TreeAbove b) ..} = case Maybe (TreeAbove b) treeAbove of Maybe (TreeAbove b) Nothing -> DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a. a -> Maybe a Just DeleteOrUpdate (TreeCursor a b) forall a. DeleteOrUpdate a Deleted Just TreeAbove b ta -> case TreeAbove b -> [CTree b] forall b. TreeAbove b -> [CTree b] treeAboveRights TreeAbove b ta of [] -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a. Maybe a Nothing CTree b tree : [CTree b] xs -> DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a. a -> Maybe a Just (DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b))) -> (Maybe (TreeAbove b) -> DeleteOrUpdate (TreeCursor a b)) -> Maybe (TreeAbove b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall b c a. (b -> c) -> (a -> b) -> a -> c . TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) forall a. a -> DeleteOrUpdate a Updated (TreeCursor a b -> DeleteOrUpdate (TreeCursor a b)) -> (Maybe (TreeAbove b) -> TreeCursor a b) -> Maybe (TreeAbove b) -> DeleteOrUpdate (TreeCursor a b) forall b c a. (b -> c) -> (a -> b) -> a -> c . (b -> a) -> CTree b -> Maybe (TreeAbove b) -> TreeCursor a b forall b a. (b -> a) -> CTree b -> Maybe (TreeAbove b) -> TreeCursor a b makeTreeCursorWithAbove b -> a g CTree b tree (Maybe (TreeAbove b) -> Maybe (DeleteOrUpdate (TreeCursor a b))) -> Maybe (TreeAbove b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a b. (a -> b) -> a -> b $ TreeAbove b -> Maybe (TreeAbove b) forall a. a -> Maybe a Just TreeAbove b ta {treeAboveRights :: [CTree b] treeAboveRights = [CTree b] xs} treeCursorDeleteSubTreeAndSelectAbove :: (b -> a) -> TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) treeCursorDeleteSubTreeAndSelectAbove :: (b -> a) -> TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) treeCursorDeleteSubTreeAndSelectAbove b -> a g TreeCursor {a Maybe (TreeAbove b) CForest b treeBelow :: CForest b treeCurrent :: a treeAbove :: Maybe (TreeAbove b) treeBelow :: forall a b. TreeCursor a b -> CForest b treeCurrent :: forall a b. TreeCursor a b -> a treeAbove :: forall a b. TreeCursor a b -> Maybe (TreeAbove b) ..} = case Maybe (TreeAbove b) treeAbove of Maybe (TreeAbove b) Nothing -> DeleteOrUpdate (TreeCursor a b) forall a. DeleteOrUpdate a Deleted Just TreeAbove {b [CTree b] Maybe (TreeAbove b) treeAboveNode :: forall b. TreeAbove b -> b treeAboveAbove :: forall b. TreeAbove b -> Maybe (TreeAbove b) treeAboveRights :: [CTree b] treeAboveNode :: b treeAboveAbove :: Maybe (TreeAbove b) treeAboveLefts :: [CTree b] treeAboveRights :: forall b. TreeAbove b -> [CTree b] treeAboveLefts :: forall b. TreeAbove b -> [CTree b] ..} -> TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) forall a. a -> DeleteOrUpdate a Updated (TreeCursor a b -> DeleteOrUpdate (TreeCursor a b)) -> TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) forall a b. (a -> b) -> a -> b $ TreeCursor :: forall a b. Maybe (TreeAbove b) -> a -> CForest b -> TreeCursor a b TreeCursor { treeAbove :: Maybe (TreeAbove b) treeAbove = Maybe (TreeAbove b) treeAboveAbove, treeCurrent :: a treeCurrent = b -> a g b treeAboveNode, treeBelow :: CForest b treeBelow = [CTree b] -> CForest b forall a. [CTree a] -> CForest a openForest ([CTree b] -> CForest b) -> [CTree b] -> CForest b forall a b. (a -> b) -> a -> b $ [CTree b] -> [CTree b] forall a. [a] -> [a] reverse [CTree b] treeAboveLefts [CTree b] -> [CTree b] -> [CTree b] forall a. [a] -> [a] -> [a] ++ [CTree b] treeAboveRights } treeCursorRemoveSubTree :: (b -> a) -> TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) treeCursorRemoveSubTree :: (b -> a) -> TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) treeCursorRemoveSubTree b -> a g TreeCursor a b tc = Maybe (DeleteOrUpdate (TreeCursor a b)) -> Maybe (DeleteOrUpdate (TreeCursor a b)) -> DeleteOrUpdate (TreeCursor a b) forall a. Maybe (DeleteOrUpdate a) -> Maybe (DeleteOrUpdate a) -> DeleteOrUpdate a joinDeletes ((b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall b a. (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteSubTreeAndSelectPrevious b -> a g TreeCursor a b tc) ((b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall b a. (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteSubTreeAndSelectNext b -> a g TreeCursor a b tc) DeleteOrUpdate (TreeCursor a b) -> DeleteOrUpdate (TreeCursor a b) -> DeleteOrUpdate (TreeCursor a b) forall (f :: * -> *) a. Alternative f => f a -> f a -> f a <|> (b -> a) -> TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) forall b a. (b -> a) -> TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) treeCursorDeleteSubTreeAndSelectAbove b -> a g TreeCursor a b tc treeCursorDeleteSubTree :: (b -> a) -> TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) treeCursorDeleteSubTree :: (b -> a) -> TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) treeCursorDeleteSubTree b -> a g TreeCursor a b tc = Maybe (DeleteOrUpdate (TreeCursor a b)) -> Maybe (DeleteOrUpdate (TreeCursor a b)) -> DeleteOrUpdate (TreeCursor a b) forall a. Maybe (DeleteOrUpdate a) -> Maybe (DeleteOrUpdate a) -> DeleteOrUpdate a joinDeletes ((b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall b a. (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteSubTreeAndSelectNext b -> a g TreeCursor a b tc) ((b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall b a. (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteSubTreeAndSelectPrevious b -> a g TreeCursor a b tc) DeleteOrUpdate (TreeCursor a b) -> DeleteOrUpdate (TreeCursor a b) -> DeleteOrUpdate (TreeCursor a b) forall (f :: * -> *) a. Alternative f => f a -> f a -> f a <|> (b -> a) -> TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) forall b a. (b -> a) -> TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) treeCursorDeleteSubTreeAndSelectAbove b -> a g TreeCursor a b tc treeCursorDeleteElemAndSelectPrevious :: (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteElemAndSelectPrevious :: (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteElemAndSelectPrevious b -> a g TreeCursor {a Maybe (TreeAbove b) CForest b treeBelow :: CForest b treeCurrent :: a treeAbove :: Maybe (TreeAbove b) treeBelow :: forall a b. TreeCursor a b -> CForest b treeCurrent :: forall a b. TreeCursor a b -> a treeAbove :: forall a b. TreeCursor a b -> Maybe (TreeAbove b) ..} = case Maybe (TreeAbove b) treeAbove of Maybe (TreeAbove b) Nothing -> case CForest b treeBelow of CForest b EmptyCForest -> DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a. a -> Maybe a Just DeleteOrUpdate (TreeCursor a b) forall a. DeleteOrUpdate a Deleted CForest b _ -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a. Maybe a Nothing Just TreeAbove b ta -> case TreeAbove b -> [CTree b] forall b. TreeAbove b -> [CTree b] treeAboveLefts TreeAbove b ta of [] -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a. Maybe a Nothing CTree b tree : [CTree b] xs -> DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a. a -> Maybe a Just (DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b))) -> (Maybe (TreeAbove b) -> DeleteOrUpdate (TreeCursor a b)) -> Maybe (TreeAbove b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall b c a. (b -> c) -> (a -> b) -> a -> c . TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) forall a. a -> DeleteOrUpdate a Updated (TreeCursor a b -> DeleteOrUpdate (TreeCursor a b)) -> (Maybe (TreeAbove b) -> TreeCursor a b) -> Maybe (TreeAbove b) -> DeleteOrUpdate (TreeCursor a b) forall b c a. (b -> c) -> (a -> b) -> a -> c . (b -> a) -> CTree b -> Maybe (TreeAbove b) -> TreeCursor a b forall b a. (b -> a) -> CTree b -> Maybe (TreeAbove b) -> TreeCursor a b makeTreeCursorWithAbove b -> a g CTree b tree (Maybe (TreeAbove b) -> Maybe (DeleteOrUpdate (TreeCursor a b))) -> Maybe (TreeAbove b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a b. (a -> b) -> a -> b $ TreeAbove b -> Maybe (TreeAbove b) forall a. a -> Maybe a Just TreeAbove b ta { treeAboveLefts :: [CTree b] treeAboveLefts = [CTree b] xs, treeAboveRights :: [CTree b] treeAboveRights = CForest b -> [CTree b] forall a. CForest a -> [CTree a] unpackCForest CForest b treeBelow [CTree b] -> [CTree b] -> [CTree b] forall a. [a] -> [a] -> [a] ++ TreeAbove b -> [CTree b] forall b. TreeAbove b -> [CTree b] treeAboveRights TreeAbove b ta } treeCursorDeleteElemAndSelectNext :: (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteElemAndSelectNext :: (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteElemAndSelectNext b -> a g TreeCursor {a Maybe (TreeAbove b) CForest b treeBelow :: CForest b treeCurrent :: a treeAbove :: Maybe (TreeAbove b) treeBelow :: forall a b. TreeCursor a b -> CForest b treeCurrent :: forall a b. TreeCursor a b -> a treeAbove :: forall a b. TreeCursor a b -> Maybe (TreeAbove b) ..} = case CForest b treeBelow of CForest b EmptyCForest -> case Maybe (TreeAbove b) treeAbove of Maybe (TreeAbove b) Nothing -> DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a. a -> Maybe a Just DeleteOrUpdate (TreeCursor a b) forall a. DeleteOrUpdate a Deleted Just TreeAbove b ta -> case TreeAbove b -> [CTree b] forall b. TreeAbove b -> [CTree b] treeAboveRights TreeAbove b ta of [] -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a. Maybe a Nothing CTree b tree : [CTree b] xs -> DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a. a -> Maybe a Just (DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b))) -> (Maybe (TreeAbove b) -> DeleteOrUpdate (TreeCursor a b)) -> Maybe (TreeAbove b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall b c a. (b -> c) -> (a -> b) -> a -> c . TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) forall a. a -> DeleteOrUpdate a Updated (TreeCursor a b -> DeleteOrUpdate (TreeCursor a b)) -> (Maybe (TreeAbove b) -> TreeCursor a b) -> Maybe (TreeAbove b) -> DeleteOrUpdate (TreeCursor a b) forall b c a. (b -> c) -> (a -> b) -> a -> c . (b -> a) -> CTree b -> Maybe (TreeAbove b) -> TreeCursor a b forall b a. (b -> a) -> CTree b -> Maybe (TreeAbove b) -> TreeCursor a b makeTreeCursorWithAbove b -> a g CTree b tree (Maybe (TreeAbove b) -> Maybe (DeleteOrUpdate (TreeCursor a b))) -> Maybe (TreeAbove b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a b. (a -> b) -> a -> b $ TreeAbove b -> Maybe (TreeAbove b) forall a. a -> Maybe a Just TreeAbove b ta {treeAboveRights :: [CTree b] treeAboveRights = [CTree b] xs} ClosedForest NonEmpty (Tree b) ts -> case Maybe (TreeAbove b) treeAbove of Maybe (TreeAbove b) Nothing -> case NonEmpty (Tree b) ts of (Node b e Forest b ts_ :| Forest b xs) -> let t :: CTree b t = b -> CForest b -> CTree b forall a. a -> CForest a -> CTree a CNode b e (CForest b -> CTree b) -> CForest b -> CTree b forall a b. (a -> b) -> a -> b $ Forest b -> CForest b forall a. [Tree a] -> CForest a closedForest (Forest b -> CForest b) -> Forest b -> CForest b forall a b. (a -> b) -> a -> b $ Forest b ts_ Forest b -> Forest b -> Forest b forall a. [a] -> [a] -> [a] ++ Forest b xs in DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a. a -> Maybe a Just (DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b))) -> (TreeCursor a b -> DeleteOrUpdate (TreeCursor a b)) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall b c a. (b -> c) -> (a -> b) -> a -> c . TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) forall a. a -> DeleteOrUpdate a Updated (TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b))) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a b. (a -> b) -> a -> b $ (b -> a) -> CTree b -> Maybe (TreeAbove b) -> TreeCursor a b forall b a. (b -> a) -> CTree b -> Maybe (TreeAbove b) -> TreeCursor a b makeTreeCursorWithAbove b -> a g CTree b t Maybe (TreeAbove b) treeAbove Just TreeAbove b ta -> case TreeAbove b -> [CTree b] forall b. TreeAbove b -> [CTree b] treeAboveRights TreeAbove b ta of [] -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a. Maybe a Nothing CTree b tree : [CTree b] xs -> DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a. a -> Maybe a Just (DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b))) -> (Maybe (TreeAbove b) -> DeleteOrUpdate (TreeCursor a b)) -> Maybe (TreeAbove b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall b c a. (b -> c) -> (a -> b) -> a -> c . TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) forall a. a -> DeleteOrUpdate a Updated (TreeCursor a b -> DeleteOrUpdate (TreeCursor a b)) -> (Maybe (TreeAbove b) -> TreeCursor a b) -> Maybe (TreeAbove b) -> DeleteOrUpdate (TreeCursor a b) forall b c a. (b -> c) -> (a -> b) -> a -> c . (b -> a) -> CTree b -> Maybe (TreeAbove b) -> TreeCursor a b forall b a. (b -> a) -> CTree b -> Maybe (TreeAbove b) -> TreeCursor a b makeTreeCursorWithAbove b -> a g CTree b tree (Maybe (TreeAbove b) -> Maybe (DeleteOrUpdate (TreeCursor a b))) -> Maybe (TreeAbove b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a b. (a -> b) -> a -> b $ TreeAbove b -> Maybe (TreeAbove b) forall a. a -> Maybe a Just TreeAbove b ta { treeAboveLefts :: [CTree b] treeAboveLefts = (Tree b -> CTree b) -> Forest b -> [CTree b] forall a b. (a -> b) -> [a] -> [b] map Tree b -> CTree b forall a. Tree a -> CTree a makeCTree (Forest b -> Forest b forall a. [a] -> [a] reverse (Forest b -> Forest b) -> Forest b -> Forest b forall a b. (a -> b) -> a -> b $ NonEmpty (Tree b) -> Forest b forall a. NonEmpty a -> [a] NE.toList NonEmpty (Tree b) ts) [CTree b] -> [CTree b] -> [CTree b] forall a. [a] -> [a] -> [a] ++ TreeAbove b -> [CTree b] forall b. TreeAbove b -> [CTree b] treeAboveLefts TreeAbove b ta, treeAboveRights :: [CTree b] treeAboveRights = [CTree b] xs } OpenForest (CNode b e CForest b ts :| [CTree b] xs) -> let t :: CTree b t = b -> CForest b -> CTree b forall a. a -> CForest a -> CTree a CNode b e (CForest b -> CTree b) -> CForest b -> CTree b forall a b. (a -> b) -> a -> b $ case CForest b ts of CForest b EmptyCForest -> [CTree b] -> CForest b forall a. [CTree a] -> CForest a openForest [CTree b] xs OpenForest NonEmpty (CTree b) ts_ -> [CTree b] -> CForest b forall a. [CTree a] -> CForest a openForest ([CTree b] -> CForest b) -> [CTree b] -> CForest b forall a b. (a -> b) -> a -> b $ NonEmpty (CTree b) -> [CTree b] forall a. NonEmpty a -> [a] NE.toList NonEmpty (CTree b) ts_ [CTree b] -> [CTree b] -> [CTree b] forall a. [a] -> [a] -> [a] ++ [CTree b] xs ClosedForest NonEmpty (Tree b) ts_ -> Forest b -> CForest b forall a. [Tree a] -> CForest a closedForest (Forest b -> CForest b) -> Forest b -> CForest b forall a b. (a -> b) -> a -> b $ NonEmpty (Tree b) -> Forest b forall a. NonEmpty a -> [a] NE.toList NonEmpty (Tree b) ts_ Forest b -> Forest b -> Forest b forall a. [a] -> [a] -> [a] ++ (CTree b -> Tree b) -> [CTree b] -> Forest b forall a b. (a -> b) -> [a] -> [b] map CTree b -> Tree b forall a. CTree a -> Tree a rebuildCTree [CTree b] xs in DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a. a -> Maybe a Just (DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b))) -> (TreeCursor a b -> DeleteOrUpdate (TreeCursor a b)) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall b c a. (b -> c) -> (a -> b) -> a -> c . TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) forall a. a -> DeleteOrUpdate a Updated (TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b))) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a b. (a -> b) -> a -> b $ (b -> a) -> CTree b -> Maybe (TreeAbove b) -> TreeCursor a b forall b a. (b -> a) -> CTree b -> Maybe (TreeAbove b) -> TreeCursor a b makeTreeCursorWithAbove b -> a g CTree b t Maybe (TreeAbove b) treeAbove treeCursorDeleteElemAndSelectAbove :: (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteElemAndSelectAbove :: (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteElemAndSelectAbove b -> a g TreeCursor {a Maybe (TreeAbove b) CForest b treeBelow :: CForest b treeCurrent :: a treeAbove :: Maybe (TreeAbove b) treeBelow :: forall a b. TreeCursor a b -> CForest b treeCurrent :: forall a b. TreeCursor a b -> a treeAbove :: forall a b. TreeCursor a b -> Maybe (TreeAbove b) ..} = case Maybe (TreeAbove b) treeAbove of Maybe (TreeAbove b) Nothing -> case CForest b treeBelow of CForest b EmptyCForest -> DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a. a -> Maybe a Just DeleteOrUpdate (TreeCursor a b) forall a. DeleteOrUpdate a Deleted CForest b _ -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a. Maybe a Nothing Just TreeAbove {b [CTree b] Maybe (TreeAbove b) treeAboveRights :: [CTree b] treeAboveNode :: b treeAboveAbove :: Maybe (TreeAbove b) treeAboveLefts :: [CTree b] treeAboveNode :: forall b. TreeAbove b -> b treeAboveAbove :: forall b. TreeAbove b -> Maybe (TreeAbove b) treeAboveRights :: forall b. TreeAbove b -> [CTree b] treeAboveLefts :: forall b. TreeAbove b -> [CTree b] ..} -> DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a. a -> Maybe a Just (DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b))) -> DeleteOrUpdate (TreeCursor a b) -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall a b. (a -> b) -> a -> b $ TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) forall a. a -> DeleteOrUpdate a Updated (TreeCursor a b -> DeleteOrUpdate (TreeCursor a b)) -> TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) forall a b. (a -> b) -> a -> b $ TreeCursor :: forall a b. Maybe (TreeAbove b) -> a -> CForest b -> TreeCursor a b TreeCursor { treeAbove :: Maybe (TreeAbove b) treeAbove = Maybe (TreeAbove b) treeAboveAbove, treeCurrent :: a treeCurrent = b -> a g b treeAboveNode, treeBelow :: CForest b treeBelow = [CTree b] -> CForest b forall a. [CTree a] -> CForest a openForest ([CTree b] -> CForest b) -> [CTree b] -> CForest b forall a b. (a -> b) -> a -> b $ [CTree b] -> [CTree b] forall a. [a] -> [a] reverse [CTree b] treeAboveLefts [CTree b] -> [CTree b] -> [CTree b] forall a. [a] -> [a] -> [a] ++ CForest b -> [CTree b] forall a. CForest a -> [CTree a] unpackCForest CForest b treeBelow [CTree b] -> [CTree b] -> [CTree b] forall a. [a] -> [a] -> [a] ++ [CTree b] treeAboveRights } treeCursorRemoveElem :: (b -> a) -> TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) treeCursorRemoveElem :: (b -> a) -> TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) treeCursorRemoveElem b -> a g TreeCursor a b tc = Maybe (DeleteOrUpdate (TreeCursor a b)) -> Maybe (DeleteOrUpdate (TreeCursor a b)) -> Maybe (DeleteOrUpdate (TreeCursor a b)) -> DeleteOrUpdate (TreeCursor a b) forall a. Maybe (DeleteOrUpdate a) -> Maybe (DeleteOrUpdate a) -> Maybe (DeleteOrUpdate a) -> DeleteOrUpdate a joinDeletes3 ((b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall b a. (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteElemAndSelectPrevious b -> a g TreeCursor a b tc) ((b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall b a. (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteElemAndSelectNext b -> a g TreeCursor a b tc) ((b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall b a. (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteElemAndSelectAbove b -> a g TreeCursor a b tc) treeCursorDeleteElem :: (b -> a) -> TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) treeCursorDeleteElem :: (b -> a) -> TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) treeCursorDeleteElem b -> a g TreeCursor a b tc = Maybe (DeleteOrUpdate (TreeCursor a b)) -> Maybe (DeleteOrUpdate (TreeCursor a b)) -> Maybe (DeleteOrUpdate (TreeCursor a b)) -> DeleteOrUpdate (TreeCursor a b) forall a. Maybe (DeleteOrUpdate a) -> Maybe (DeleteOrUpdate a) -> Maybe (DeleteOrUpdate a) -> DeleteOrUpdate a joinDeletes3 ((b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall b a. (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteElemAndSelectNext b -> a g TreeCursor a b tc) ((b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall b a. (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteElemAndSelectPrevious b -> a g TreeCursor a b tc) ((b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) forall b a. (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteElemAndSelectAbove b -> a g TreeCursor a b tc)