module Ghcitui.NameBinding (NameBinding (..), BindingValue (..), renderNamesTxt) where

import qualified Data.Text as T

-- | Value associated with a binding.
data BindingValue a = Uneval | Evald a deriving (BindingValue a -> BindingValue a -> Bool
(BindingValue a -> BindingValue a -> Bool)
-> (BindingValue a -> BindingValue a -> Bool)
-> Eq (BindingValue a)
forall a. Eq a => BindingValue a -> BindingValue a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => BindingValue a -> BindingValue a -> Bool
== :: BindingValue a -> BindingValue a -> Bool
$c/= :: forall a. Eq a => BindingValue a -> BindingValue a -> Bool
/= :: BindingValue a -> BindingValue a -> Bool
Eq, Int -> BindingValue a -> ShowS
[BindingValue a] -> ShowS
BindingValue a -> String
(Int -> BindingValue a -> ShowS)
-> (BindingValue a -> String)
-> ([BindingValue a] -> ShowS)
-> Show (BindingValue a)
forall a. Show a => Int -> BindingValue a -> ShowS
forall a. Show a => [BindingValue a] -> ShowS
forall a. Show a => BindingValue a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> BindingValue a -> ShowS
showsPrec :: Int -> BindingValue a -> ShowS
$cshow :: forall a. Show a => BindingValue a -> String
show :: BindingValue a -> String
$cshowList :: forall a. Show a => [BindingValue a] -> ShowS
showList :: [BindingValue a] -> ShowS
Show)

-- | Represents a binding in the local context.
data NameBinding t = NameBinding
    { forall t. NameBinding t -> t
bName :: t
    -- ^ Name of the binding.
    , forall t. NameBinding t -> t
bType :: t
    -- ^ Type of the binding.
    , forall t. NameBinding t -> BindingValue t
bValue :: BindingValue t
    -- ^ Value of the binding.
    }
    deriving (NameBinding t -> NameBinding t -> Bool
(NameBinding t -> NameBinding t -> Bool)
-> (NameBinding t -> NameBinding t -> Bool) -> Eq (NameBinding t)
forall t. Eq t => NameBinding t -> NameBinding t -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall t. Eq t => NameBinding t -> NameBinding t -> Bool
== :: NameBinding t -> NameBinding t -> Bool
$c/= :: forall t. Eq t => NameBinding t -> NameBinding t -> Bool
/= :: NameBinding t -> NameBinding t -> Bool
Eq, Int -> NameBinding t -> ShowS
[NameBinding t] -> ShowS
NameBinding t -> String
(Int -> NameBinding t -> ShowS)
-> (NameBinding t -> String)
-> ([NameBinding t] -> ShowS)
-> Show (NameBinding t)
forall t. Show t => Int -> NameBinding t -> ShowS
forall t. Show t => [NameBinding t] -> ShowS
forall t. Show t => NameBinding t -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall t. Show t => Int -> NameBinding t -> ShowS
showsPrec :: Int -> NameBinding t -> ShowS
$cshow :: forall t. Show t => NameBinding t -> String
show :: NameBinding t -> String
$cshowList :: forall t. Show t => [NameBinding t] -> ShowS
showList :: [NameBinding t] -> ShowS
Show)

-- | Display the name bindings together into a group of Texts.
renderNamesTxt :: (Functor f) => f (NameBinding T.Text) -> f T.Text
renderNamesTxt :: forall (f :: * -> *). Functor f => f (NameBinding Text) -> f Text
renderNamesTxt f (NameBinding Text)
ns = NameBinding Text -> Text
onEach (NameBinding Text -> Text) -> f (NameBinding Text) -> f Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f (NameBinding Text)
ns
  where
    valueRender :: BindingValue a -> a
valueRender BindingValue a
Uneval = a
"_"
    valueRender (Evald a
v) = a
v
    onEach :: NameBinding Text -> Text
onEach NameBinding Text
nb = [Text] -> Text
T.concat [NameBinding Text -> Text
forall t. NameBinding t -> t
bName NameBinding Text
nb, Text
" :: ", NameBinding Text -> Text
forall t. NameBinding t -> t
bType NameBinding Text
nb, Text
" = ", BindingValue Text -> Text
forall {a}. IsString a => BindingValue a -> a
valueRender (BindingValue Text -> Text)
-> (NameBinding Text -> BindingValue Text)
-> NameBinding Text
-> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NameBinding Text -> BindingValue Text
forall t. NameBinding t -> BindingValue t
bValue (NameBinding Text -> Text) -> NameBinding Text -> Text
forall a b. (a -> b) -> a -> b
$ NameBinding Text
nb]