enum-text-rio-1.0.0.0: src/Text/Enum/RIO/Fmt.hs
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Text.Enum.RIO.Fmt
(
-- * Overview
-- $overview
-- * EnumText, Display Types
-- $example
-- * TBuilder
TBuilder
-- * UsingBuildable and UsingDisplay
, UsingBuildable(..)
, UsingDisplay(..)
-- * Text.Enum.Text
, module Text.Enum.Text
-- * Fmt
, module Fmt
) where
import Fmt hiding (Builder)
import Fmt.Internal.Core
import qualified Data.ByteString.Lazy as LBS
import Data.ByteString.Builder
import qualified Data.Text.Lazy.Builder as T
import RIO
import Text.Enum.Text
{- $overview
If you want to use @fmt@ with @rio@, preparing 'Utf8Builder' log messages with
`fmt` and so forth then you can just import this module along side @RIO@.
See the demo program for a working example.
-}
-- | RIO export @Builder@ as the @ByteString@ builder so we have to hide it and
-- provide this in its stead.
type TBuilder = T.Builder
{- $example
To place an 'EnumText' type in 'Display' (with the 'Buildable' and
'TextParsable' instance reqiored by 'EnumText') you can do something like this:
@
{\-\# LANGUAGE DeriveAnyClass #-\}
{\-\# LANGUAGE DerivingVia #-\}
{\-\# LANGUAGE NoImplicitPrelude #-\}
import RIO
import Text.Enum.RIO.Fmt
data Foo = FOO_bar | FOO_bar_baz
deriving (Bounded,Enum,EnumText,Eq,Ord,Show)
deriving (Buildable,Display,TextParsable) via UsingEnumText Foo
@
-}
-- | @derive@ @via@ this type if you have a `Buildable` and want to derive a
-- corresponding 'Display' instance
newtype UsingBuildable a = UsingBuildable { _UsingBuildable :: a }
-- | @derive@ @via@ this type if you have a `Display` type and want to derive a
-- corresponding 'Buildable' instance
newtype UsingDisplay a = UsingDisplay { _UsingDisplay :: a }
instance Buildable a => Display (UsingBuildable a) where
display (UsingBuildable x) =
Utf8Builder
$ byteString
$ encodeUtf8
$ fmt
$ build x
instance Display a => Buildable (UsingDisplay a) where
build (UsingDisplay x) =
build
$ decodeUtf8With lenientDecode
$ LBS.toStrict
$ toLazyByteString
$ getUtf8Builder
$ display x
instance EnumText a => Display (UsingEnumText a) where
display (UsingEnumText x) =
Utf8Builder
$ byteString
$ encodeUtf8
$ fmt
$ buildEnumText x
-- | With this instance we can use `fmt` to generate `Utf8Builder` strings
instance FromBuilder Utf8Builder where
fromBuilder = Utf8Builder . byteString . fromBuilder