-- | Printer combinators related to operators.
module HIndent.Pretty.Combinators.Op
  ( unlessSpecialOp
  ) where

import Control.Monad
import GHC.Types.Name
import GHC.Types.Name.Reader
import HIndent.Printer

-- | Runs the printer unless HIndent needs to treat the operator specially.
unlessSpecialOp :: RdrName -> Printer () -> Printer ()
unlessSpecialOp :: RdrName -> Printer () -> Printer ()
unlessSpecialOp RdrName
name = Bool -> Printer () -> Printer ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (RdrName -> Bool
isSpecialOp RdrName
name)

-- | Returns if HIndent needs special treatment for the operator.
isSpecialOp :: RdrName -> Bool
isSpecialOp :: RdrName -> Bool
isSpecialOp (Unqual OccName
name) = String -> Bool
isSpecialOpString (String -> Bool) -> String -> Bool
forall a b. (a -> b) -> a -> b
$ OccName -> String
occNameString OccName
name
isSpecialOp Qual {} = Bool
False
isSpecialOp Orig {} = String -> Bool
forall a. HasCallStack => String -> a
error String
"This node is never used in the parsed stage."
isSpecialOp (Exact Name
name) = String -> Bool
isSpecialOpString (String -> Bool) -> String -> Bool
forall a b. (a -> b) -> a -> b
$ OccName -> String
occNameString (OccName -> String) -> OccName -> String
forall a b. (a -> b) -> a -> b
$ Name -> OccName
nameOccName Name
name

-- | Returns if HIndent needs special treatment for the operator.
isSpecialOpString :: String -> Bool
isSpecialOpString :: String -> Bool
isSpecialOpString String
name = String
name String -> [String] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String
"()", String
"[]", String
"->", String
":"]