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