{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}

-- | Abstract data type for displaying the help
--   We are currently displaying the help as a Box from the boxes library
--   but we could as well use Text or Doc () from Prettyprinter
module Data.Registry.Options.Display where

import Protolude

-- | Data type for displaying elements as Text or Doc
--    - a represents a section of the final document
--    - b is the element to display (or part of that element)
--    - c is the output (Text or Doc)
newtype Display (a :: Symbol) b c = Display {forall (a :: Symbol) b c. Display a b c -> b -> c
display :: b -> c}
  deriving newtype (forall a b. a -> Display a b b -> Display a b a
forall a b. (a -> b) -> Display a b a -> Display a b b
forall (a :: Symbol) b a b. a -> Display a b b -> Display a b a
forall (a :: Symbol) b a b.
(a -> b) -> Display a b a -> Display a b b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> Display a b b -> Display a b a
$c<$ :: forall (a :: Symbol) b a b. a -> Display a b b -> Display a b a
fmap :: forall a b. (a -> b) -> Display a b a -> Display a b b
$cfmap :: forall (a :: Symbol) b a b.
(a -> b) -> Display a b a -> Display a b b
Functor, forall a. a -> Display a b a
forall a b. Display a b a -> Display a b b -> Display a b a
forall a b. Display a b a -> Display a b b -> Display a b b
forall a b. Display a b (a -> b) -> Display a b a -> Display a b b
forall a b c.
(a -> b -> c) -> Display a b a -> Display a b b -> Display a b c
forall (a :: Symbol) b. Functor (Display a b)
forall (a :: Symbol) b a. a -> Display a b a
forall (a :: Symbol) b a b.
Display a b a -> Display a b b -> Display a b a
forall (a :: Symbol) b a b.
Display a b a -> Display a b b -> Display a b b
forall (a :: Symbol) b a b.
Display a b (a -> b) -> Display a b a -> Display a b b
forall (a :: Symbol) b a b c.
(a -> b -> c) -> Display a b a -> Display a b b -> Display a b c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: forall a b. Display a b a -> Display a b b -> Display a b a
$c<* :: forall (a :: Symbol) b a b.
Display a b a -> Display a b b -> Display a b a
*> :: forall a b. Display a b a -> Display a b b -> Display a b b
$c*> :: forall (a :: Symbol) b a b.
Display a b a -> Display a b b -> Display a b b
liftA2 :: forall a b c.
(a -> b -> c) -> Display a b a -> Display a b b -> Display a b c
$cliftA2 :: forall (a :: Symbol) b a b c.
(a -> b -> c) -> Display a b a -> Display a b b -> Display a b c
<*> :: forall a b. Display a b (a -> b) -> Display a b a -> Display a b b
$c<*> :: forall (a :: Symbol) b a b.
Display a b (a -> b) -> Display a b a -> Display a b b
pure :: forall a. a -> Display a b a
$cpure :: forall (a :: Symbol) b a. a -> Display a b a
Applicative)

-- | noDisplay can be used as a placeholder while defining the structure of a display
noDisplay :: forall a b c. (Monoid c) => Display a b c
noDisplay :: forall (a :: Symbol) b c. Monoid c => Display a b c
noDisplay = forall (a :: Symbol) b c. (b -> c) -> Display a b c
Display (forall a b. a -> b -> a
const forall a. Monoid a => a
mempty)