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