{-# 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 :: forall b a. (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteSubTreeAndSelectPrevious b -> a g TreeCursor {a Maybe (TreeAbove b) CForest b treeAbove :: Maybe (TreeAbove b) treeCurrent :: a treeBelow :: CForest b treeAbove :: forall a b. TreeCursor a b -> Maybe (TreeAbove b) treeBelow :: forall a b. TreeCursor a b -> CForest b treeCurrent :: forall a b. TreeCursor a b -> a ..} = 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 = xs} treeCursorDeleteSubTreeAndSelectNext :: (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteSubTreeAndSelectNext :: forall b a. (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteSubTreeAndSelectNext b -> a g TreeCursor {a Maybe (TreeAbove b) CForest b treeAbove :: forall a b. TreeCursor a b -> Maybe (TreeAbove b) treeBelow :: forall a b. TreeCursor a b -> CForest b treeCurrent :: forall a b. TreeCursor a b -> a treeAbove :: Maybe (TreeAbove b) treeCurrent :: a treeBelow :: CForest 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 = xs} treeCursorDeleteSubTreeAndSelectAbove :: (b -> a) -> TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) treeCursorDeleteSubTreeAndSelectAbove :: forall b a. (b -> a) -> TreeCursor a b -> DeleteOrUpdate (TreeCursor a b) treeCursorDeleteSubTreeAndSelectAbove b -> a g TreeCursor {a Maybe (TreeAbove b) CForest b treeAbove :: forall a b. TreeCursor a b -> Maybe (TreeAbove b) treeBelow :: forall a b. TreeCursor a b -> CForest b treeCurrent :: forall a b. TreeCursor a b -> a treeAbove :: Maybe (TreeAbove b) treeCurrent :: a treeBelow :: CForest 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) treeAboveLefts :: forall b. TreeAbove b -> [CTree b] treeAboveRights :: forall b. TreeAbove b -> [CTree b] treeAboveLefts :: [CTree b] treeAboveAbove :: Maybe (TreeAbove b) treeAboveNode :: b treeAboveRights :: [CTree b] treeAboveAbove :: forall b. TreeAbove b -> Maybe (TreeAbove b) treeAboveNode :: forall b. TreeAbove b -> 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 { 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 :: forall b a. (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 a. DeleteOrUpdate a -> DeleteOrUpdate a -> DeleteOrUpdate a 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 :: forall b a. (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 a. DeleteOrUpdate a -> DeleteOrUpdate a -> DeleteOrUpdate a 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 :: forall b a. (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteElemAndSelectPrevious b -> a g TreeCursor {a Maybe (TreeAbove b) CForest b treeAbove :: forall a b. TreeCursor a b -> Maybe (TreeAbove b) treeBelow :: forall a b. TreeCursor a b -> CForest b treeCurrent :: forall a b. TreeCursor a b -> a treeAbove :: Maybe (TreeAbove b) treeCurrent :: a treeBelow :: CForest 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 = xs, treeAboveRights = unpackCForest treeBelow ++ treeAboveRights ta } treeCursorDeleteElemAndSelectNext :: (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteElemAndSelectNext :: forall b a. (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteElemAndSelectNext b -> a g TreeCursor {a Maybe (TreeAbove b) CForest b treeAbove :: forall a b. TreeCursor a b -> Maybe (TreeAbove b) treeBelow :: forall a b. TreeCursor a b -> CForest b treeCurrent :: forall a b. TreeCursor a b -> a treeAbove :: Maybe (TreeAbove b) treeCurrent :: a treeBelow :: CForest 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 = 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 [Tree b] ts_ :| [Tree 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 $ [Tree b] -> CForest b forall a. [Tree a] -> CForest a closedForest ([Tree b] -> CForest b) -> [Tree b] -> CForest b forall a b. (a -> b) -> a -> b $ [Tree b] ts_ [Tree b] -> [Tree b] -> [Tree b] forall a. [a] -> [a] -> [a] ++ [Tree 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 = map makeCTree (reverse $ NE.toList ts) ++ treeAboveLefts ta, treeAboveRights = 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_ -> [Tree b] -> CForest b forall a. [Tree a] -> CForest a closedForest ([Tree b] -> CForest b) -> [Tree b] -> CForest b forall a b. (a -> b) -> a -> b $ NonEmpty (Tree b) -> [Tree b] forall a. NonEmpty a -> [a] NE.toList NonEmpty (Tree b) ts_ [Tree b] -> [Tree b] -> [Tree b] forall a. [a] -> [a] -> [a] ++ (CTree b -> Tree b) -> [CTree b] -> [Tree 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 :: forall b a. (b -> a) -> TreeCursor a b -> Maybe (DeleteOrUpdate (TreeCursor a b)) treeCursorDeleteElemAndSelectAbove b -> a g TreeCursor {a Maybe (TreeAbove b) CForest b treeAbove :: forall a b. TreeCursor a b -> Maybe (TreeAbove b) treeBelow :: forall a b. TreeCursor a b -> CForest b treeCurrent :: forall a b. TreeCursor a b -> a treeAbove :: Maybe (TreeAbove b) treeCurrent :: a treeBelow :: CForest 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) treeAboveLefts :: forall b. TreeAbove b -> [CTree b] treeAboveRights :: forall b. TreeAbove b -> [CTree b] treeAboveAbove :: forall b. TreeAbove b -> Maybe (TreeAbove b) treeAboveNode :: forall b. TreeAbove b -> b treeAboveLefts :: [CTree b] treeAboveAbove :: Maybe (TreeAbove b) treeAboveNode :: b treeAboveRights :: [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 { 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 :: forall b a. (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 :: forall b a. (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)