{-# LANGUAGE OverloadedStrings #-}

module Drasil.Printers.Common (
  wrap, paren, brak, brace, pipes, dpipes, angbrac, dollar, quote, dquote,
  ddollars, underscores, asterisks, dasterisks, fSlashes, CanCarryText(..)
) where

import Data.Text (Text)
import Data.Text qualified as T
import Prettyprinter qualified as PNew
import Text.PrettyPrint qualified as PLegacy

class CanCarryText t where
  holdText :: Text -> t

instance CanCarryText String where
  holdText :: Text -> String
holdText = Text -> String
T.unpack
  {-# INLINE holdText #-}

instance CanCarryText Text where
  holdText :: Text -> Text
holdText = Text -> Text
forall a. a -> a
id
  {-# INLINE holdText #-}

instance CanCarryText PLegacy.Doc where
  holdText :: Text -> Doc
holdText = String -> Doc
PLegacy.text (String -> Doc) -> (Text -> String) -> Text -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack
  {-# INLINE holdText #-}

instance CanCarryText (PNew.Doc ann) where
  holdText :: Text -> Doc ann
holdText = Text -> Doc ann
forall ann. Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
PNew.pretty
  {-# INLINE holdText #-}

type CanTextWrap dt = (Semigroup dt, CanCarryText dt)

wrap :: (CanTextWrap a) => Text -> Text -> a -> a
wrap :: forall a. CanTextWrap a => Text -> Text -> a -> a
wrap Text
l Text
r a
e = Text -> a
forall t. CanCarryText t => Text -> t
holdText Text
l a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
e a -> a -> a
forall a. Semigroup a => a -> a -> a
<> Text -> a
forall t. CanCarryText t => Text -> t
holdText Text
r
{-# INLINE wrap #-}

paren, brak, brace, pipes, dpipes, angbrac, dollar, quote, dquote, ddollars,
  underscores, asterisks, dasterisks, fSlashes :: (CanTextWrap a) => a -> a
paren :: forall a. CanTextWrap a => a -> a
paren = Text -> Text -> a -> a
forall a. CanTextWrap a => Text -> Text -> a -> a
wrap Text
"(" Text
")"
brak :: forall a. CanTextWrap a => a -> a
brak = Text -> Text -> a -> a
forall a. CanTextWrap a => Text -> Text -> a -> a
wrap Text
"[" Text
"]"
brace :: forall a. CanTextWrap a => a -> a
brace = Text -> Text -> a -> a
forall a. CanTextWrap a => Text -> Text -> a -> a
wrap Text
"{" Text
"}"
pipes :: forall a. CanTextWrap a => a -> a
pipes = Text -> Text -> a -> a
forall a. CanTextWrap a => Text -> Text -> a -> a
wrap Text
"|" Text
"|"
dpipes :: forall a. CanTextWrap a => a -> a
dpipes = a -> a
forall a. CanTextWrap a => a -> a
pipes (a -> a) -> (a -> a) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a
forall a. CanTextWrap a => a -> a
pipes
angbrac :: forall a. CanTextWrap a => a -> a
angbrac = Text -> Text -> a -> a
forall a. CanTextWrap a => Text -> Text -> a -> a
wrap Text
"<" Text
">"
dollar :: forall a. CanTextWrap a => a -> a
dollar = Text -> Text -> a -> a
forall a. CanTextWrap a => Text -> Text -> a -> a
wrap Text
"$" Text
"$"
quote :: forall a. CanTextWrap a => a -> a
quote = Text -> Text -> a -> a
forall a. CanTextWrap a => Text -> Text -> a -> a
wrap Text
"'" Text
"'"
dquote :: forall a. CanTextWrap a => a -> a
dquote = Text -> Text -> a -> a
forall a. CanTextWrap a => Text -> Text -> a -> a
wrap Text
"\"" Text
"\""
ddollars :: forall a. CanTextWrap a => a -> a
ddollars = a -> a
forall a. CanTextWrap a => a -> a
dollar (a -> a) -> (a -> a) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a
forall a. CanTextWrap a => a -> a
dollar
underscores :: forall a. CanTextWrap a => a -> a
underscores = Text -> Text -> a -> a
forall a. CanTextWrap a => Text -> Text -> a -> a
wrap Text
"_" Text
"_"
asterisks :: forall a. CanTextWrap a => a -> a
asterisks = Text -> Text -> a -> a
forall a. CanTextWrap a => Text -> Text -> a -> a
wrap Text
"*" Text
"*"
dasterisks :: forall a. CanTextWrap a => a -> a
dasterisks = a -> a
forall a. CanTextWrap a => a -> a
asterisks (a -> a) -> (a -> a) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a
forall a. CanTextWrap a => a -> a
asterisks
fSlashes :: forall a. CanTextWrap a => a -> a
fSlashes = Text -> Text -> a -> a
forall a. CanTextWrap a => Text -> Text -> a -> a
wrap Text
"/" Text
"/"