{-# 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)