-- | Printer operators for wrapping texts with a prefix and a suffix.
module HIndent.Pretty.Combinators.Wrap
  ( parens
  , parensIfSymbol
  , bananaBrackets
  , braces
  , doubleQuotes
  , brackets
  , typedBrackets
  , backticks
  , backticksIfNotSymbol
  , wrapWithBars
  , promotedListBrackets
  , promotedTupleParens
  , unboxedParens
  ) where

import GHC.Types.Name
import HIndent.Pretty.Combinators.Indent
import HIndent.Pretty.Combinators.String
import HIndent.Printer

-- | This function wraps the printer with parentheses.
parens :: Printer a -> Printer a
parens :: forall a. Printer a -> Printer a
parens = String -> String -> Printer a -> Printer a
forall a. String -> String -> Printer a -> Printer a
wrap String
"(" String
")"

-- | This function wraps the printer with parentheses if the identifier
-- contains only symbols.
parensIfSymbol :: OccName -> Printer a -> Printer a
parensIfSymbol :: forall a. OccName -> Printer a -> Printer a
parensIfSymbol OccName
name
  | OccName -> Bool
isSymOcc OccName
name = Printer a -> Printer a
forall a. Printer a -> Printer a
parens
  | Bool
otherwise = Printer a -> Printer a
forall a. a -> a
id

-- | Wraps with "(|" and "|)"
bananaBrackets :: Printer a -> Printer a
bananaBrackets :: forall a. Printer a -> Printer a
bananaBrackets = String -> String -> Printer a -> Printer a
forall a. String -> String -> Printer a -> Printer a
wrap String
"(|" String
"|)"

-- | This function wraps the printer with braces.
braces :: Printer a -> Printer a
braces :: forall a. Printer a -> Printer a
braces = String -> String -> Printer a -> Printer a
forall a. String -> String -> Printer a -> Printer a
wrap String
"{" String
"}"

-- | This function wraps the printer with brackets.
brackets :: Printer a -> Printer a
brackets :: forall a. Printer a -> Printer a
brackets = String -> String -> Printer a -> Printer a
forall a. String -> String -> Printer a -> Printer a
wrap String
"[" String
"]"

-- | Wraps with @[||@ and @||]@.
typedBrackets :: Printer a -> Printer a
typedBrackets :: forall a. Printer a -> Printer a
typedBrackets = String -> String -> Printer a -> Printer a
forall a. String -> String -> Printer a -> Printer a
wrap String
"[||" String
"||]"

-- | Wraps with double quotes.
doubleQuotes :: Printer a -> Printer a
doubleQuotes :: forall a. Printer a -> Printer a
doubleQuotes = String -> String -> Printer a -> Printer a
forall a. String -> String -> Printer a -> Printer a
wrap String
"\"" String
"\""

-- | This function wraps the printer with backticks.
backticks :: Printer a -> Printer a
backticks :: forall a. Printer a -> Printer a
backticks = String -> String -> Printer a -> Printer a
forall a. String -> String -> Printer a -> Printer a
wrap String
"`" String
"`"

-- | This function wraps the printer with backticks if the identifier
-- contains at least one non-symbol character.
backticksIfNotSymbol :: OccName -> Printer a -> Printer a
backticksIfNotSymbol :: forall a. OccName -> Printer a -> Printer a
backticksIfNotSymbol OccName
name
  | OccName -> Bool
isSymOcc OccName
name = Printer a -> Printer a
forall a. a -> a
id
  | Bool
otherwise = Printer a -> Printer a
forall a. Printer a -> Printer a
backticks

-- | This function wraps the printer with bars (|).
wrapWithBars :: Printer a -> Printer a
wrapWithBars :: forall a. Printer a -> Printer a
wrapWithBars = String -> String -> Printer a -> Printer a
forall a. String -> String -> Printer a -> Printer a
wrap String
"|" String
"|"

-- | This function wraps the printer with @'[ @ and @]@ for a promoted
-- list.
promotedListBrackets :: Printer a -> Printer a
promotedListBrackets :: forall a. Printer a -> Printer a
promotedListBrackets = String -> String -> Printer a -> Printer a
forall a. String -> String -> Printer a -> Printer a
wrap String
"'[ " String
"]"

-- | This function wraps the printer with @'( @ and @)@ for a promoted
-- tuple.
promotedTupleParens :: Printer a -> Printer a
promotedTupleParens :: forall a. Printer a -> Printer a
promotedTupleParens = String -> String -> Printer a -> Printer a
forall a. String -> String -> Printer a -> Printer a
wrap String
"'( " String
")"

-- | Wraps with @(# @ and @ #)@.
unboxedParens :: Printer a -> Printer a
unboxedParens :: forall a. Printer a -> Printer a
unboxedParens = String -> String -> Printer a -> Printer a
forall a. String -> String -> Printer a -> Printer a
wrap String
"(# " String
" #)"

-- | This function wraps the printer with the prefix and the suffix.
wrap :: String -> String -> Printer a -> Printer a
wrap :: forall a. String -> String -> Printer a -> Printer a
wrap String
open String
close Printer a
p = HasCallStack => String -> Printer ()
String -> Printer ()
string String
open Printer () -> Printer a -> Printer a
forall a. Printer () -> Printer a -> Printer a
|=> Printer a
p Printer a -> Printer () -> Printer a
forall a b. Printer a -> Printer b -> Printer a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* HasCallStack => String -> Printer ()
String -> Printer ()
string String
close