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