{-# LANGUAGE ScopedTypeVariables #-}

module Cursor.Brick.Map where

import Brick.Types
import Brick.Widgets.Core
import Cursor.Map

horizontalMapCursorWidget ::
  (k -> v -> Widget n) ->
  (KeyValueCursor kc vc k v -> Widget n) ->
  (k -> v -> Widget n) ->
  MapCursor kc vc k v ->
  Widget n
horizontalMapCursorWidget :: (k -> v -> Widget n)
-> (KeyValueCursor kc vc k v -> Widget n)
-> (k -> v -> Widget n)
-> MapCursor kc vc k v
-> Widget n
horizontalMapCursorWidget k -> v -> Widget n
beforeFunc KeyValueCursor kc vc k v -> Widget n
curFunc k -> v -> Widget n
afterFunc =
  ([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> Widget n)
-> MapCursor kc vc k v -> Widget n
forall k v kc vc n.
([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> Widget n)
-> MapCursor kc vc k v -> Widget n
mapCursorWidget (([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> Widget n)
 -> MapCursor kc vc k v -> Widget n)
-> ([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> Widget n)
-> MapCursor kc vc k v
-> Widget n
forall a b. (a -> b) -> a -> b
$ \[(k, v)]
befores KeyValueCursor kc vc k v
current [(k, v)]
afters ->
    [Widget n] -> Widget n
forall n. [Widget n] -> Widget n
hBox ([Widget n] -> Widget n) -> [Widget n] -> Widget n
forall a b. (a -> b) -> a -> b
$
      [[Widget n]] -> [Widget n]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
        [ ((k, v) -> Widget n) -> [(k, v)] -> [Widget n]
forall a b. (a -> b) -> [a] -> [b]
map ((k -> v -> Widget n) -> (k, v) -> Widget n
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry k -> v -> Widget n
beforeFunc) [(k, v)]
befores,
          [KeyValueCursor kc vc k v -> Widget n
curFunc KeyValueCursor kc vc k v
current],
          ((k, v) -> Widget n) -> [(k, v)] -> [Widget n]
forall a b. (a -> b) -> [a] -> [b]
map ((k -> v -> Widget n) -> (k, v) -> Widget n
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry k -> v -> Widget n
afterFunc) [(k, v)]
afters
        ]

horizontalMapCursorWidgetM ::
  Applicative f =>
  (k -> v -> f (Widget n)) ->
  (KeyValueCursor kc vc k v -> f (Widget n)) ->
  (k -> v -> f (Widget n)) ->
  MapCursor kc vc k v ->
  f (Widget n)
horizontalMapCursorWidgetM :: (k -> v -> f (Widget n))
-> (KeyValueCursor kc vc k v -> f (Widget n))
-> (k -> v -> f (Widget n))
-> MapCursor kc vc k v
-> f (Widget n)
horizontalMapCursorWidgetM k -> v -> f (Widget n)
beforeFunc KeyValueCursor kc vc k v -> f (Widget n)
curFunc k -> v -> f (Widget n)
afterFunc =
  ([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> f (Widget n))
-> MapCursor kc vc k v -> f (Widget n)
forall k v kc vc (m :: * -> *) n.
([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> m (Widget n))
-> MapCursor kc vc k v -> m (Widget n)
mapCursorWidgetM (([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> f (Widget n))
 -> MapCursor kc vc k v -> f (Widget n))
-> ([(k, v)]
    -> KeyValueCursor kc vc k v -> [(k, v)] -> f (Widget n))
-> MapCursor kc vc k v
-> f (Widget n)
forall a b. (a -> b) -> a -> b
$ \[(k, v)]
befores KeyValueCursor kc vc k v
current [(k, v)]
afters ->
    [Widget n] -> Widget n
forall n. [Widget n] -> Widget n
hBox
      ([Widget n] -> Widget n) -> f [Widget n] -> f (Widget n)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [f (Widget n)] -> f [Widget n]
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
sequenceA
        ( [[f (Widget n)]] -> [f (Widget n)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
            [ ((k, v) -> f (Widget n)) -> [(k, v)] -> [f (Widget n)]
forall a b. (a -> b) -> [a] -> [b]
map ((k -> v -> f (Widget n)) -> (k, v) -> f (Widget n)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry k -> v -> f (Widget n)
beforeFunc) [(k, v)]
befores,
              [KeyValueCursor kc vc k v -> f (Widget n)
curFunc KeyValueCursor kc vc k v
current],
              ((k, v) -> f (Widget n)) -> [(k, v)] -> [f (Widget n)]
forall a b. (a -> b) -> [a] -> [b]
map ((k -> v -> f (Widget n)) -> (k, v) -> f (Widget n)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry k -> v -> f (Widget n)
afterFunc) [(k, v)]
afters
            ]
        )

verticalMapCursorWidget ::
  (k -> v -> Widget n) ->
  (KeyValueCursor kc vc k v -> Widget n) ->
  (k -> v -> Widget n) ->
  MapCursor kc vc k v ->
  Widget n
verticalMapCursorWidget :: (k -> v -> Widget n)
-> (KeyValueCursor kc vc k v -> Widget n)
-> (k -> v -> Widget n)
-> MapCursor kc vc k v
-> Widget n
verticalMapCursorWidget k -> v -> Widget n
beforeFunc KeyValueCursor kc vc k v -> Widget n
curFunc k -> v -> Widget n
afterFunc =
  ([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> Widget n)
-> MapCursor kc vc k v -> Widget n
forall k v kc vc n.
([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> Widget n)
-> MapCursor kc vc k v -> Widget n
mapCursorWidget (([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> Widget n)
 -> MapCursor kc vc k v -> Widget n)
-> ([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> Widget n)
-> MapCursor kc vc k v
-> Widget n
forall a b. (a -> b) -> a -> b
$ \[(k, v)]
befores KeyValueCursor kc vc k v
current [(k, v)]
afters ->
    [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
$
      [[Widget n]] -> [Widget n]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
        [ ((k, v) -> Widget n) -> [(k, v)] -> [Widget n]
forall a b. (a -> b) -> [a] -> [b]
map ((k -> v -> Widget n) -> (k, v) -> Widget n
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry k -> v -> Widget n
beforeFunc) [(k, v)]
befores,
          [KeyValueCursor kc vc k v -> Widget n
curFunc KeyValueCursor kc vc k v
current],
          ((k, v) -> Widget n) -> [(k, v)] -> [Widget n]
forall a b. (a -> b) -> [a] -> [b]
map ((k -> v -> Widget n) -> (k, v) -> Widget n
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry k -> v -> Widget n
afterFunc) [(k, v)]
afters
        ]

verticalMapCursorWidgetM ::
  Applicative f =>
  (k -> v -> f (Widget n)) ->
  (KeyValueCursor kc vc k v -> f (Widget n)) ->
  (k -> v -> f (Widget n)) ->
  MapCursor kc vc k v ->
  f (Widget n)
verticalMapCursorWidgetM :: (k -> v -> f (Widget n))
-> (KeyValueCursor kc vc k v -> f (Widget n))
-> (k -> v -> f (Widget n))
-> MapCursor kc vc k v
-> f (Widget n)
verticalMapCursorWidgetM k -> v -> f (Widget n)
beforeFunc KeyValueCursor kc vc k v -> f (Widget n)
curFunc k -> v -> f (Widget n)
afterFunc =
  ([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> f (Widget n))
-> MapCursor kc vc k v -> f (Widget n)
forall k v kc vc (m :: * -> *) n.
([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> m (Widget n))
-> MapCursor kc vc k v -> m (Widget n)
mapCursorWidgetM (([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> f (Widget n))
 -> MapCursor kc vc k v -> f (Widget n))
-> ([(k, v)]
    -> KeyValueCursor kc vc k v -> [(k, v)] -> f (Widget n))
-> MapCursor kc vc k v
-> f (Widget n)
forall a b. (a -> b) -> a -> b
$ \[(k, v)]
befores KeyValueCursor kc vc k v
current [(k, v)]
afters ->
    [Widget n] -> Widget n
forall n. [Widget n] -> Widget n
vBox
      ([Widget n] -> Widget n) -> f [Widget n] -> f (Widget n)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [f (Widget n)] -> f [Widget n]
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
sequenceA
        ( [[f (Widget n)]] -> [f (Widget n)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
            [ ((k, v) -> f (Widget n)) -> [(k, v)] -> [f (Widget n)]
forall a b. (a -> b) -> [a] -> [b]
map ((k -> v -> f (Widget n)) -> (k, v) -> f (Widget n)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry k -> v -> f (Widget n)
beforeFunc) [(k, v)]
befores,
              [KeyValueCursor kc vc k v -> f (Widget n)
curFunc KeyValueCursor kc vc k v
current],
              ((k, v) -> f (Widget n)) -> [(k, v)] -> [f (Widget n)]
forall a b. (a -> b) -> [a] -> [b]
map ((k -> v -> f (Widget n)) -> (k, v) -> f (Widget n)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry k -> v -> f (Widget n)
afterFunc) [(k, v)]
afters
            ]
        )

mapCursorWidget ::
  ([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> Widget n) ->
  MapCursor kc vc k v ->
  Widget n
mapCursorWidget :: ([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> Widget n)
-> MapCursor kc vc k v -> Widget n
mapCursorWidget = ([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> Widget n)
-> MapCursor kc vc k v -> Widget n
forall k v kc vc c.
([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> c)
-> MapCursor kc vc k v -> c
foldMapCursor

mapCursorWidgetM ::
  ([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> m (Widget n)) ->
  MapCursor kc vc k v ->
  m (Widget n)
mapCursorWidgetM :: ([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> m (Widget n))
-> MapCursor kc vc k v -> m (Widget n)
mapCursorWidgetM = ([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> m (Widget n))
-> MapCursor kc vc k v -> m (Widget n)
forall k v kc vc c.
([(k, v)] -> KeyValueCursor kc vc k v -> [(k, v)] -> c)
-> MapCursor kc vc k v -> c
foldMapCursor