packages feed

Blammo-1.1.2.1: src/Blammo/Logging/Terminal/LogPiece.hs

module Blammo.Logging.Terminal.LogPiece
  ( LogPiece
  , logPiece
  , render
  , visibleLength
  , bytestring

    -- * Built-in pieces
  , offset
  ) where

import Prelude

import Data.ByteString (ByteString)
import Data.Semigroup (Sum (..))
import Data.String (IsString (..))
import Data.Text (Text, pack)
import qualified Data.Text as T
import Data.Text.Encoding (encodeUtf8)

data LogPiece = LogPiece
  { lpRendered :: Text
  , lpVisibleLength :: Sum Int
  }

-- TODO: When we drop support for ghc-8.6:
-- deriving stock Generic
-- deriving (Semigroup, Monoid) via (GenericSemigroupMonoid LogPiece)

instance Semigroup LogPiece where
  a <> b =
    LogPiece
      { lpRendered = lpRendered a <> lpRendered b
      , lpVisibleLength = lpVisibleLength a <> lpVisibleLength b
      }

instance Monoid LogPiece where
  mempty = LogPiece mempty mempty

instance IsString LogPiece where
  fromString = logPiece id . pack

logPiece
  :: (Text -> Text)
  -- ^ Non-visible decoration, such as color escapes
  -> Text
  -- ^ Raw
  -> LogPiece
logPiece f t =
  LogPiece {lpRendered = f t, lpVisibleLength = Sum $ T.length t}

render :: LogPiece -> Text
render = lpRendered

bytestring :: LogPiece -> ByteString
bytestring = encodeUtf8 . render

visibleLength :: LogPiece -> Int
visibleLength = getSum . lpVisibleLength

offset :: Int -> LogPiece
offset n = LogPiece {lpRendered = T.replicate n " ", lpVisibleLength = Sum n}