content: -- | 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 = wrap "(" ")"
  
  -- | This function wraps the printer with parentheses if the identifier
  -- contains only symbols.
  parensIfSymbol :: OccName -> Printer a -> Printer a
  parensIfSymbol name
    | isSymOcc name = parens
    | otherwise = id
  
  -- | Wraps with "(|" and "|)"
  bananaBrackets :: Printer a -> Printer a
  bananaBrackets = wrap "(|" "|)"
  
  -- | This function wraps the printer with braces.
  braces :: Printer a -> Printer a
  braces = wrap "{" "}"
  
  -- | This function wraps the printer with brackets.
  brackets :: Printer a -> Printer a
  brackets = wrap "[" "]"
  
  -- | Wraps with @[||@ and @||]@.
  typedBrackets :: Printer a -> Printer a
  typedBrackets = wrap "[||" "||]"
  
  -- | Wraps with double quotes.
  doubleQuotes :: Printer a -> Printer a
  doubleQuotes = wrap "\"" "\""
  
  -- | This function wraps the printer with backticks.
  backticks :: Printer a -> Printer a
  backticks = wrap "`" "`"
  
  -- | This function wraps the printer with backticks if the identifier
  -- contains at least one non-symbol character.
  backticksIfNotSymbol :: OccName -> Printer a -> Printer a
  backticksIfNotSymbol name
    | isSymOcc name = id
    | otherwise = backticks
  
  -- | This function wraps the printer with bars (|).
  wrapWithBars :: Printer a -> Printer a
  wrapWithBars = wrap "|" "|"
  
  -- | This function wraps the printer with @'[ @ and @]@ for a promoted
  -- list.
  promotedListBrackets :: Printer a -> Printer a
  promotedListBrackets = wrap "'[ " "]"
  
  -- | This function wraps the printer with @'( @ and @)@ for a promoted
  -- tuple.
  promotedTupleParens :: Printer a -> Printer a
  promotedTupleParens = wrap "'( " ")"
  
  -- | Wraps with @(# @ and @ #)@.
  unboxedParens :: Printer a -> Printer a
  unboxedParens = wrap "(# " " #)"
  
  -- | This function wraps the printer with the prefix and the suffix.
  wrap :: String -> String -> Printer a -> Printer a
  wrap open close p = string open |=> p <* string close
  