-- | Operator fixities.
--
-- It is very difficult to take operators' fixities into account as fixity
-- information is not stored in an AST. While `ghc-lib-parser-ex` provides
-- `fixitiesFromModule`, it is almost useless as operators are usually imported
-- from other modules.
--
-- Ormolu is trying to resolve this issue by examing Hackage, but doing the same
-- way in HIndent is not so easy.
module HIndent.Fixity
  ( fixities
  ) where

import GHC.Types.Fixity
import Language.Haskell.GhclibParserEx.Fixity

-- | Operator fixities that HIndent supports.
fixities :: [(String, Fixity)]
fixities :: [(String, Fixity)]
fixities = [(String, Fixity)]
baseFixities [(String, Fixity)] -> [(String, Fixity)] -> [(String, Fixity)]
forall a. Semigroup a => a -> a -> a
<> [(String, Fixity)]
lensFixities

-- | Fixities of operators defined in lens package.
lensFixities :: [(String, Fixity)]
lensFixities :: [(String, Fixity)]
lensFixities =
  [[(String, Fixity)]] -> [(String, Fixity)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
    [ Int -> [String] -> [(String, Fixity)]
infixr_
        Int
4
        [ String
".~"
        , String
"%~"
        , String
"+~"
        , String
"-~"
        , String
"*~"
        , String
"//~"
        , String
"^~"
        , String
"^^~"
        , String
"**~"
        , String
"||~"
        , String
"<>~"
        , String
"&&~"
        , String
"<.~"
        , String
"?~"
        , String
"<?~"
        , String
"%@~"
        , String
".@~"
        ]
    , Int -> [String] -> [(String, Fixity)]
infix_
        Int
4
        [ String
".="
        , String
"%="
        , String
"+="
        , String
"-="
        , String
"*="
        , String
"//="
        , String
"^="
        , String
"^^="
        , String
"**="
        , String
"||="
        , String
"<>="
        , String
"&&="
        , String
"<.="
        , String
"?="
        , String
"<?="
        , String
"%@="
        , String
".@="
        ]
    , Int -> [String] -> [(String, Fixity)]
infixr_ Int
2 [String
"<^"]
    , Int -> [String] -> [(String, Fixity)]
infixl_ Int
1 [String
"&"]
    ]