{-# 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 :: (CTree b -> m (Widget n))
-> (TreeCursor a b -> m (Widget n))
-> (CTree b -> m (Widget n))
-> ForestCursor a b
-> m (Widget n)
horizontalForestCursorWidgetM CTree b -> m (Widget n)
prevFunc TreeCursor a b -> m (Widget n)
curFunc CTree b -> m (Widget n)
nextFunc =
  (CTree b -> m (Widget n))
-> (TreeCursor a b -> m (Widget n))
-> (CTree b -> m (Widget n))
-> NonEmptyCursor (TreeCursor a b) (CTree b)
-> m (Widget n)
forall (f :: * -> *) b n a.
Applicative f =>
(b -> f (Widget n))
-> (a -> f (Widget n))
-> (b -> f (Widget n))
-> NonEmptyCursor a b
-> f (Widget n)
horizontalNonEmptyCursorWidgetM CTree b -> m (Widget n)
prevFunc TreeCursor a b -> m (Widget n)
curFunc CTree b -> m (Widget n)
nextFunc
    (NonEmptyCursor (TreeCursor a b) (CTree b) -> m (Widget n))
-> (ForestCursor a b -> NonEmptyCursor (TreeCursor a b) (CTree b))
-> ForestCursor a b
-> m (Widget n)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ForestCursor a b -> NonEmptyCursor (TreeCursor a b) (CTree b)
forall a b.
ForestCursor a b -> NonEmptyCursor (TreeCursor a b) (CTree b)
forestCursorListCursor

horizontalForestCursorWidget ::
  (CTree b -> Widget n) ->
  (TreeCursor a b -> Widget n) ->
  (CTree b -> Widget n) ->
  ForestCursor a b ->
  Widget n
horizontalForestCursorWidget :: (CTree b -> Widget n)
-> (TreeCursor a b -> Widget n)
-> (CTree b -> Widget n)
-> ForestCursor a b
-> Widget n
horizontalForestCursorWidget CTree b -> Widget n
prevFunc TreeCursor a b -> Widget n
curFunc CTree b -> Widget n
nextFunc =
  (CTree b -> Widget n)
-> (TreeCursor a b -> Widget n)
-> (CTree b -> Widget n)
-> NonEmptyCursor (TreeCursor a b) (CTree b)
-> Widget n
forall b n a.
(b -> Widget n)
-> (a -> Widget n)
-> (b -> Widget n)
-> NonEmptyCursor a b
-> Widget n
horizontalNonEmptyCursorWidget CTree b -> Widget n
prevFunc TreeCursor a b -> Widget n
curFunc CTree b -> Widget n
nextFunc
    (NonEmptyCursor (TreeCursor a b) (CTree b) -> Widget n)
-> (ForestCursor a b -> NonEmptyCursor (TreeCursor a b) (CTree b))
-> ForestCursor a b
-> Widget n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ForestCursor a b -> NonEmptyCursor (TreeCursor a b) (CTree b)
forall a b.
ForestCursor a b -> NonEmptyCursor (TreeCursor a b) (CTree b)
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 :: (a -> m (Widget n))
-> (b -> m (Widget n)) -> Int -> ForestCursor a b -> m (Widget n)
verticalPaddedForestCursorWidgetM a -> m (Widget n)
goA b -> m (Widget n)
goB Int
padding =
  (CTree b -> m (Widget n))
-> (TreeCursor a b -> m (Widget n))
-> (CTree b -> m (Widget n))
-> ForestCursor a b
-> m (Widget n)
forall (m :: * -> *) b n a.
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
    CTree b -> m (Widget n)
goCTree
    ((a -> m (Widget n))
-> (b -> m (Widget n)) -> Int -> TreeCursor a b -> m (Widget n)
forall a b n (m :: * -> *).
Monad m =>
(a -> m (Widget n))
-> (b -> m (Widget n)) -> Int -> TreeCursor a b -> m (Widget n)
verticalPaddedTreeCursorWidgetM a -> m (Widget n)
goA b -> m (Widget n)
goB Int
padding)
    CTree b -> m (Widget n)
goCTree
  where
    goCTree :: CTree b -> m (Widget n)
    goCTree :: CTree b -> m (Widget n)
goCTree (CNode b
b CForest b
cf) = do
      Widget n
top <- b -> m (Widget n)
goB b
b
      Widget n
bot <- CForest b -> m (Widget n)
goCForest CForest b
cf
      Widget n -> m (Widget n)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Widget n -> m (Widget n)) -> Widget n -> m (Widget n)
forall a b. (a -> b) -> a -> b
$ Widget n
top Widget n -> Widget n -> Widget n
forall n. Widget n -> Widget n -> Widget n
<=> Padding -> Widget n -> Widget n
forall n. Padding -> Widget n -> Widget n
padLeft (Int -> Padding
Pad Int
padding) Widget n
bot
    goCForest :: CForest b -> m (Widget n)
    goCForest :: CForest b -> m (Widget n)
goCForest = \case
      CForest b
EmptyCForest -> Widget n -> m (Widget n)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Widget n
forall n. Widget n
emptyWidget
      ClosedForest NonEmpty (Tree b)
_ -> Widget n -> m (Widget n)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Widget n
forall n. Widget n
emptyWidget
      OpenForest NonEmpty (CTree b)
nect -> ([Widget n] -> Widget n) -> m [Widget n] -> m (Widget n)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Widget n] -> Widget n
forall n. [Widget n] -> Widget n
vBox (m [Widget n] -> m (Widget n)) -> m [Widget n] -> m (Widget n)
forall a b. (a -> b) -> a -> b
$ (CTree b -> m (Widget n)) -> [CTree b] -> m [Widget n]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse CTree b -> m (Widget n)
goCTree ([CTree b] -> m [Widget n]) -> [CTree b] -> m [Widget n]
forall a b. (a -> b) -> a -> b
$ NonEmpty (CTree b) -> [CTree b]
forall a. NonEmpty a -> [a]
NE.toList NonEmpty (CTree b)
nect

verticalPaddedForestCursorWidget ::
  forall a b n.
  (a -> Widget n) ->
  (b -> Widget n) ->
  Int ->
  ForestCursor a b ->
  Widget n
verticalPaddedForestCursorWidget :: (a -> Widget n)
-> (b -> Widget n) -> Int -> ForestCursor a b -> Widget n
verticalPaddedForestCursorWidget a -> Widget n
goA b -> Widget n
goB Int
padding =
  (CTree b -> Widget n)
-> (TreeCursor a b -> Widget n)
-> (CTree b -> Widget n)
-> ForestCursor a b
-> Widget n
forall b n a.
(CTree b -> Widget n)
-> (TreeCursor a b -> Widget n)
-> (CTree b -> Widget n)
-> ForestCursor a b
-> Widget n
verticalForestCursorWidget
    CTree b -> Widget n
goCTree
    ((a -> Widget n)
-> (b -> Widget n) -> Int -> TreeCursor a b -> Widget n
forall a b n.
(a -> Widget n)
-> (b -> Widget n) -> Int -> TreeCursor a b -> Widget n
verticalPaddedTreeCursorWidget a -> Widget n
goA b -> Widget n
goB Int
padding)
    CTree b -> Widget n
goCTree
  where
    goCTree :: CTree b -> Widget n
    goCTree :: CTree b -> Widget n
goCTree (CNode b
b CForest b
cf) = b -> Widget n
goB b
b Widget n -> Widget n -> Widget n
forall n. Widget n -> Widget n -> Widget n
<=> Padding -> Widget n -> Widget n
forall n. Padding -> Widget n -> Widget n
padLeft (Int -> Padding
Pad Int
padding) (CForest b -> Widget n
goCForest CForest b
cf)
    goCForest :: CForest b -> Widget n
    goCForest :: CForest b -> Widget n
goCForest = \case
      CForest b
EmptyCForest -> Widget n
forall n. Widget n
emptyWidget
      ClosedForest NonEmpty (Tree b)
_ -> Widget n
forall n. Widget n
emptyWidget
      OpenForest NonEmpty (CTree b)
nect -> [Widget n] -> Widget n
forall n. [Widget n] -> Widget n
vBox ([Widget n] -> Widget n) -> [Widget n] -> Widget n
forall a b. (a -> b) -> a -> b
$ (CTree b -> Widget n) -> [CTree b] -> [Widget n]
forall a b. (a -> b) -> [a] -> [b]
map CTree b -> Widget n
goCTree ([CTree b] -> [Widget n]) -> [CTree b] -> [Widget n]
forall a b. (a -> b) -> a -> b
$ NonEmpty (CTree b) -> [CTree b]
forall a. NonEmpty a -> [a]
NE.toList NonEmpty (CTree b)
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 :: (CTree b -> m (Widget n))
-> (TreeCursor a b -> m (Widget n))
-> (CTree b -> m (Widget n))
-> ForestCursor a b
-> m (Widget n)
verticalForestCursorWidgetM CTree b -> m (Widget n)
prevFunc TreeCursor a b -> m (Widget n)
curFunc CTree b -> m (Widget n)
nextFunc =
  (CTree b -> m (Widget n))
-> (TreeCursor a b -> m (Widget n))
-> (CTree b -> m (Widget n))
-> NonEmptyCursor (TreeCursor a b) (CTree b)
-> m (Widget n)
forall (f :: * -> *) b n a.
Applicative f =>
(b -> f (Widget n))
-> (a -> f (Widget n))
-> (b -> f (Widget n))
-> NonEmptyCursor a b
-> f (Widget n)
verticalNonEmptyCursorWidgetM CTree b -> m (Widget n)
prevFunc TreeCursor a b -> m (Widget n)
curFunc CTree b -> m (Widget n)
nextFunc
    (NonEmptyCursor (TreeCursor a b) (CTree b) -> m (Widget n))
-> (ForestCursor a b -> NonEmptyCursor (TreeCursor a b) (CTree b))
-> ForestCursor a b
-> m (Widget n)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ForestCursor a b -> NonEmptyCursor (TreeCursor a b) (CTree b)
forall a b.
ForestCursor a b -> NonEmptyCursor (TreeCursor a b) (CTree b)
forestCursorListCursor

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

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

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