--------------------------------------------------------------------------------
module Patat.Presentation.Display.Internal
    ( DisplaySettings (..)
    , themed
    ) where


--------------------------------------------------------------------------------
import           Patat.Presentation.Internal (Margins)
import           Patat.Presentation.Settings (Wrap)
import           Patat.Presentation.Syntax   (Block, RevealState, Var)
import qualified Patat.PrettyPrint           as PP
import           Patat.Size                  (Size)
import qualified Patat.Theme                 as Theme
import qualified Skylighting                 as Skylighting


--------------------------------------------------------------------------------
data DisplaySettings = DisplaySettings
    { DisplaySettings -> Size
dsSize        :: !Size
    , DisplaySettings -> Wrap
dsWrap        :: !Wrap
    , DisplaySettings -> Int
dsTabStop     :: !Int
    , DisplaySettings -> Margins
dsMargins     :: !Margins
    , DisplaySettings -> Theme
dsTheme       :: !Theme.Theme
    , DisplaySettings -> SyntaxMap
dsSyntaxMap   :: !Skylighting.SyntaxMap
    , DisplaySettings -> Var -> [Block]
dsResolve     :: !(Var -> [Block])
    , DisplaySettings -> RevealState
dsRevealState :: !RevealState
    }


--------------------------------------------------------------------------------
themed
    :: DisplaySettings -> (Theme.Theme -> Maybe Theme.Style) -> PP.Doc -> PP.Doc
themed :: DisplaySettings -> (Theme -> Maybe Style) -> Doc -> Doc
themed DisplaySettings
ds Theme -> Maybe Style
f = case Theme -> Maybe Style
f (DisplaySettings -> Theme
dsTheme DisplaySettings
ds) of
    Maybe Style
Nothing                  -> Doc -> Doc
forall a. a -> a
id
    Just (Theme.Style [])    -> Doc -> Doc
forall a. a -> a
id
    Just (Theme.Style [SGR]
codes) -> [SGR] -> Doc -> Doc
PP.ansi [SGR]
codes