{-# LANGUAGE GADTs #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedStrings #-}
module Fmt.Internal.Core where
#if __GLASGOW_HASKELL__ < 804
import Data.Monoid ((<>))
#endif
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Lazy.IO as TL
import Data.Text.Lazy.Builder hiding (fromString)
import Formatting.Buildable (Buildable(..))
class FromBuilder a where
fromBuilder :: Builder -> a
instance FromBuilder Builder where
fromBuilder = id
{-# INLINE fromBuilder #-}
instance (a ~ Char) => FromBuilder [a] where
fromBuilder = TL.unpack . toLazyText
{-# INLINE fromBuilder #-}
instance FromBuilder T.Text where
fromBuilder = TL.toStrict . toLazyText
{-# INLINE fromBuilder #-}
instance FromBuilder TL.Text where
fromBuilder = toLazyText
{-# INLINE fromBuilder #-}
instance (a ~ ()) => FromBuilder (IO a) where
fromBuilder = TL.putStr . toLazyText
{-# INLINE fromBuilder #-}
(+|) :: (FromBuilder b) => Builder -> Builder -> b
(+|) str rest = fromBuilder (str <> rest)
(|+) :: (Buildable a, FromBuilder b) => a -> Builder -> b
(|+) a rest = fromBuilder (build a <> rest)
infixr 1 +|
infixr 1 |+
(+||) :: (FromBuilder b) => Builder -> Builder -> b
(+||) str rest = str +| rest
{-# INLINE (+||) #-}
(||+) :: (Show a, FromBuilder b) => a -> Builder -> b
(||+) a rest = show a |+ rest
{-# INLINE (||+) #-}
infixr 1 +||
infixr 1 ||+
(|++|) :: (Buildable a, FromBuilder b) => a -> Builder -> b
(|++|) a rest = fromBuilder (build a <> rest)
{-# INLINE (|++|) #-}
(||++||) :: (Show a, FromBuilder b) => a -> Builder -> b
(||++||) a rest = show a |+ rest
{-# INLINE (||++||) #-}
(||++|) :: (Buildable a, FromBuilder b) => a -> Builder -> b
(||++|) a rest = a |++| rest
{-# INLINE (||++|) #-}
(|++||) :: (Show a, FromBuilder b) => a -> Builder -> b
(|++||) a rest = a ||++|| rest
{-# INLINE (|++||) #-}
infixr 1 |++|
infixr 1 ||++||
infixr 1 ||++|
infixr 1 |++||
fmt :: FromBuilder b => Builder -> b
fmt = fromBuilder
{-# INLINE fmt #-}
fmtLn :: FromBuilder b => Builder -> b
fmtLn = fromBuilder . (<> "\n")
{-# INLINE fmtLn #-}