module Ribosome.Menu.Prompt.Data.PromptConfig where

import Conduit (ConduitT)
import Control.Lens (view)

import Ribosome.Menu.Prompt.Data.PromptEvent (PromptEvent)
import Ribosome.Menu.Prompt.Data.PromptRenderer (PromptRenderer)
import Ribosome.Menu.Prompt.Data.PromptState (PromptState)
import Ribosome.Menu.Prompt.Data.PromptUpdate (PromptUpdate)

data PromptFlag =
  StartInsert
  |
  OnlyInsert
  deriving (PromptFlag -> PromptFlag -> Bool
(PromptFlag -> PromptFlag -> Bool)
-> (PromptFlag -> PromptFlag -> Bool) -> Eq PromptFlag
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PromptFlag -> PromptFlag -> Bool
$c/= :: PromptFlag -> PromptFlag -> Bool
== :: PromptFlag -> PromptFlag -> Bool
$c== :: PromptFlag -> PromptFlag -> Bool
Eq, Int -> PromptFlag -> ShowS
[PromptFlag] -> ShowS
PromptFlag -> String
(Int -> PromptFlag -> ShowS)
-> (PromptFlag -> String)
-> ([PromptFlag] -> ShowS)
-> Show PromptFlag
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PromptFlag] -> ShowS
$cshowList :: [PromptFlag] -> ShowS
show :: PromptFlag -> String
$cshow :: PromptFlag -> String
showsPrec :: Int -> PromptFlag -> ShowS
$cshowsPrec :: Int -> PromptFlag -> ShowS
Show)

data PromptConfig m =
  PromptConfig {
    PromptConfig m -> ConduitT () PromptEvent m ()
_source :: ConduitT () PromptEvent m (),
    PromptConfig m
-> [PromptFlag] -> PromptEvent -> PromptState -> m PromptUpdate
_modes :: [PromptFlag] -> PromptEvent -> PromptState -> m PromptUpdate,
    PromptConfig m -> PromptRenderer m
_render :: PromptRenderer m,
    PromptConfig m -> [PromptFlag]
_flags :: [PromptFlag]
  }

makeClassy ''PromptConfig

class TestPromptFlag a where
  promptFlag :: PromptFlag -> a -> Bool

instance TestPromptFlag [PromptFlag] where
  promptFlag :: PromptFlag -> [PromptFlag] -> Bool
promptFlag =
    PromptFlag -> [PromptFlag] -> Bool
forall (f :: * -> *) a.
(Foldable f, DisallowElem f, Eq a) =>
a -> f a -> Bool
elem

instance TestPromptFlag (PromptConfig m) where
  promptFlag :: PromptFlag -> PromptConfig m -> Bool
promptFlag PromptFlag
flag =
    PromptFlag -> [PromptFlag] -> Bool
forall a. TestPromptFlag a => PromptFlag -> a -> Bool
promptFlag PromptFlag
flag ([PromptFlag] -> Bool)
-> (PromptConfig m -> [PromptFlag]) -> PromptConfig m -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Getting [PromptFlag] (PromptConfig m) [PromptFlag]
-> PromptConfig m -> [PromptFlag]
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting [PromptFlag] (PromptConfig m) [PromptFlag]
forall c (m :: * -> *). HasPromptConfig c m => Lens' c [PromptFlag]
flags

startInsert :: TestPromptFlag a => a -> Bool
startInsert :: a -> Bool
startInsert =
  PromptFlag -> a -> Bool
forall a. TestPromptFlag a => PromptFlag -> a -> Bool
promptFlag PromptFlag
StartInsert

onlyInsert :: TestPromptFlag a => a -> Bool
onlyInsert :: a -> Bool
onlyInsert =
  PromptFlag -> a -> Bool
forall a. TestPromptFlag a => PromptFlag -> a -> Bool
promptFlag PromptFlag
OnlyInsert