module Fmt.Terminal
    ( colorF
    , colorVividF
    , module ANSIColors
    ) where

import           Fmt                       (Buildable, Builder, build)
import           Data.Monoid               ((<>))
import qualified System.Console.ANSI       as ANSI
import           System.Console.ANSI.Types as ANSIColors (Color (..))

-- | Wrap content with escape sequence to set and reset color of normal intensity.
colorF :: Buildable a => ANSI.Color -> a -> Builder
colorF = colorF' ANSI.Dull

-- | The same as `colorF` but uses vivid intensity.
colorVividF :: Buildable a => ANSI.Color -> a -> Builder
colorVividF = colorF' ANSI.Vivid

colorF' :: Buildable a => ANSI.ColorIntensity -> ANSI.Color -> a -> Builder
colorF' intensity color content
   = (build $ ANSI.setSGRCode [ANSI.SetColor ANSI.Foreground intensity color])
  <> (build content)
  <> (build $ ANSI.setSGRCode [ANSI.Reset])