packages feed

cursor-brick-0.1.0.1: src/Cursor/Brick/Forest.hs

{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Cursor.Brick.Forest where

import Brick.Types
import Brick.Widgets.Core
import Cursor.Brick.List.NonEmpty
import Cursor.Brick.Tree
import Cursor.Forest
import Cursor.Tree
import qualified Data.List.NonEmpty as NE

horizontalForestCursorWidgetM ::
  Monad m =>
  (CTree b -> m (Widget n)) ->
  (TreeCursor a b -> m (Widget n)) ->
  (CTree b -> m (Widget n)) ->
  ForestCursor a b ->
  m (Widget n)
horizontalForestCursorWidgetM prevFunc curFunc nextFunc =
  horizontalNonEmptyCursorWidgetM prevFunc curFunc nextFunc
    . forestCursorListCursor

horizontalForestCursorWidget ::
  (CTree b -> Widget n) ->
  (TreeCursor a b -> Widget n) ->
  (CTree b -> Widget n) ->
  ForestCursor a b ->
  Widget n
horizontalForestCursorWidget prevFunc curFunc nextFunc =
  horizontalNonEmptyCursorWidget prevFunc curFunc nextFunc
    . forestCursorListCursor

verticalPaddedForestCursorWidgetM ::
  forall a b n m.
  Monad m =>
  (a -> m (Widget n)) ->
  (b -> m (Widget n)) ->
  Int ->
  ForestCursor a b ->
  m (Widget n)
verticalPaddedForestCursorWidgetM goA goB padding =
  verticalForestCursorWidgetM
    goCTree
    (verticalPaddedTreeCursorWidgetM goA goB padding)
    goCTree
  where
    goCTree :: CTree b -> m (Widget n)
    goCTree (CNode b cf) = do
      top <- goB b
      bot <- goCForest cf
      pure $ top <=> padLeft (Pad padding) bot
    goCForest :: CForest b -> m (Widget n)
    goCForest = \case
      EmptyCForest -> pure emptyWidget
      ClosedForest _ -> pure emptyWidget
      OpenForest nect -> fmap vBox $ traverse goCTree $ NE.toList nect

verticalPaddedForestCursorWidget ::
  forall a b n.
  (a -> Widget n) ->
  (b -> Widget n) ->
  Int ->
  ForestCursor a b ->
  Widget n
verticalPaddedForestCursorWidget goA goB padding =
  verticalForestCursorWidget
    goCTree
    (verticalPaddedTreeCursorWidget goA goB padding)
    goCTree
  where
    goCTree :: CTree b -> Widget n
    goCTree (CNode b cf) = goB b <=> padLeft (Pad padding) (goCForest cf)
    goCForest :: CForest b -> Widget n
    goCForest = \case
      EmptyCForest -> emptyWidget
      ClosedForest _ -> emptyWidget
      OpenForest nect -> vBox $ map goCTree $ NE.toList nect

verticalForestCursorWidgetM ::
  Monad m =>
  (CTree b -> m (Widget n)) ->
  (TreeCursor a b -> m (Widget n)) ->
  (CTree b -> m (Widget n)) ->
  ForestCursor a b ->
  m (Widget n)
verticalForestCursorWidgetM prevFunc curFunc nextFunc =
  verticalNonEmptyCursorWidgetM prevFunc curFunc nextFunc
    . forestCursorListCursor

verticalForestCursorWidget ::
  (CTree b -> Widget n) ->
  (TreeCursor a b -> Widget n) ->
  (CTree b -> Widget n) ->
  ForestCursor a b ->
  Widget n
verticalForestCursorWidget prevFunc curFunc nextFunc =
  verticalNonEmptyCursorWidget prevFunc curFunc nextFunc
    . forestCursorListCursor

forestCursorWidgetM ::
  ([CTree b] -> TreeCursor a b -> [CTree b] -> m (Widget n)) ->
  ForestCursor a b ->
  m (Widget n)
forestCursorWidgetM = foldForestCursor

forestCursorWidget ::
  ([CTree b] -> TreeCursor a b -> [CTree b] -> Widget n) ->
  ForestCursor a b ->
  Widget n
forestCursorWidget = foldForestCursor