module Cursor.Tree.Collapse
  ( treeCursorOpenCurrentForest
  , treeCursorCloseCurrentForest
  , treeCursorToggleCurrentForest
  , treeCursorOpenCurrentForestRecursively
  , treeCursorToggleCurrentForestRecursively
  ) where

import qualified Data.List.NonEmpty as NE

import Cursor.Tree.Types

treeCursorOpenCurrentForest :: TreeCursor a b -> Maybe (TreeCursor a b)
treeCursorOpenCurrentForest tc =
  case treeBelow tc of
    EmptyCForest -> Nothing
    ClosedForest ts -> Just $ tc {treeBelow = OpenForest $ NE.map makeCTree ts}
    OpenForest _ -> Nothing

treeCursorCloseCurrentForest :: TreeCursor a b -> Maybe (TreeCursor a b)
treeCursorCloseCurrentForest tc =
  case treeBelow tc of
    EmptyCForest -> Nothing
    ClosedForest _ -> Nothing
    OpenForest ts ->
      Just $ tc {treeBelow = ClosedForest $ NE.map rebuildCTree ts}

treeCursorToggleCurrentForest :: TreeCursor a b -> Maybe (TreeCursor a b)
treeCursorToggleCurrentForest tc =
  case treeBelow tc of
    EmptyCForest -> Nothing
    ClosedForest ts -> Just $ tc {treeBelow = OpenForest $ NE.map makeCTree ts}
    OpenForest ts ->
      Just $ tc {treeBelow = ClosedForest $ NE.map rebuildCTree ts}

treeCursorOpenCurrentForestRecursively ::
     TreeCursor a b -> Maybe (TreeCursor a b)
treeCursorOpenCurrentForestRecursively tc =
  case treeBelow tc of
    EmptyCForest -> Nothing
    ClosedForest ts ->
      Just $ tc {treeBelow = OpenForest $ NE.map (cTree True) ts}
    OpenForest _ -> Nothing

treeCursorToggleCurrentForestRecursively ::
     TreeCursor a b -> Maybe (TreeCursor a b)
treeCursorToggleCurrentForestRecursively tc =
  case treeBelow tc of
    EmptyCForest -> Nothing
    ClosedForest ts ->
      Just $ tc {treeBelow = OpenForest $ NE.map (cTree True) ts}
    OpenForest ts ->
      Just $ tc {treeBelow = ClosedForest $ NE.map rebuildCTree ts}