1-- | 2-- Operators fixity and associativity 3-- 4module Language.PureScript.AST.Operators where 5 6import Prelude.Compat 7 8import Codec.Serialise (Serialise) 9import GHC.Generics (Generic) 10import Control.DeepSeq (NFData) 11import Data.Aeson ((.=)) 12import qualified Data.Aeson as A 13 14import Language.PureScript.Crash 15 16-- | 17-- A precedence level for an infix operator 18-- 19type Precedence = Integer 20 21-- | 22-- Associativity for infix operators 23-- 24data Associativity = Infixl | Infixr | Infix 25 deriving (Show, Eq, Ord, Generic) 26 27instance NFData Associativity 28instance Serialise Associativity 29 30showAssoc :: Associativity -> String 31showAssoc Infixl = "infixl" 32showAssoc Infixr = "infixr" 33showAssoc Infix = "infix" 34 35readAssoc :: String -> Associativity 36readAssoc "infixl" = Infixl 37readAssoc "infixr" = Infixr 38readAssoc "infix" = Infix 39readAssoc _ = internalError "readAssoc: no parse" 40 41instance A.ToJSON Associativity where 42 toJSON = A.toJSON . showAssoc 43 44instance A.FromJSON Associativity where 45 parseJSON = fmap readAssoc . A.parseJSON 46 47-- | 48-- Fixity data for infix operators 49-- 50data Fixity = Fixity Associativity Precedence 51 deriving (Show, Eq, Ord, Generic) 52 53instance NFData Fixity 54instance Serialise Fixity 55 56instance A.ToJSON Fixity where 57 toJSON (Fixity associativity precedence) = 58 A.object [ "associativity" .= associativity 59 , "precedence" .= precedence 60 ] 61