@@ -70,13 +70,19 @@ record syn = do (doc, acc) <- try (do
7070{- | Parses data declaration type (normal or codata)
7171DataI ::= 'data' | 'codata';
7272-}
73−dataI :: IdrisParser Bool
74−dataI = do reserved "data"; return False
75− <|> do reserved "codata"; return True
73+dataI :: IdrisParser DataOpts
74+dataI = do reserved "data"; return []
75+ <|> do reserved "codata"; return [Codata]
76+
77+{- | Parses if a data should not have a default eliminator
78+DefaultEliminator ::= 'noelim'?
79+ -}
80+defaultEliminator :: IdrisParser DataOpts
81+defaultEliminator = do option [DefaultEliminator] (do reserved "%noelim"; return [])
7682
7783{- | Parses a data type declaration
78−Data ::= DocComment? Accessibility? DataI FnName TypeSig ExplicitTypeDataRest?
79− | DocComment? Accessibility? DataI FnName Name* DataRest?
84+Data ::= DocComment? Accessibility? DataI DefaultEliminator FnName TypeSig ExplicitTypeDataRest?
85+ | DocComment? Accessibility? DataI DefaultEliminator FnName Name* DataRest?
8086 ;
8187Constructor' ::= Constructor KeepTerminator;
8288ExplicitTypeDataRest ::= 'where' OpenBlock Constructor'* CloseBlock;
@@ -90,29 +96,31 @@ SimpleConstructorList ::=
9096 ;
9197-}
9298data_ :: SyntaxInfo -> IdrisParser PDecl
93−data_ syn = do (doc, acc, co) <- try (do
99+data_ syn = do (doc, acc, dataOpts) <- try (do
94100 doc <- option "" (docComment '|')
95101 pushIndent
96102 acc <- optional accessibility
103+ elim <- defaultEliminator
97104 co <- dataI
98− return (doc, acc, co))
105+ let dataOpts = combineDataOpts(elim ++ co)
106+ return (doc, acc, dataOpts))
99107 fc <- getFC
100108 tyn_in <- fnName
101109 (do try (lchar ':')
102110 popIndent
103111 ty <- typeExpr (allowImp syn)
104112 let tyn = expandNS syn tyn_in
105− option (PData doc syn fc co (PLaterdecl tyn ty)) (do
113+ option (PData doc syn fc dataOpts (PLaterdecl tyn ty)) (do
106114 reserved "where"
107115 cons <- indentedBlock (constructor syn)
108116 accData acc tyn (map (\ (_, n, _, _) -> n) cons)
109− return $ PData doc syn fc co (PDatadecl tyn ty cons))) <|> (do
117+ return $ PData doc syn fc dataOpts (PDatadecl tyn ty cons))) <|> (do
110118 args <- many name
111119 let ty = bindArgs (map (const PType) args) PType
112120 let tyn = expandNS syn tyn_in
113− option (PData doc syn fc co (PLaterdecl tyn ty)) (do
121+ option (PData doc syn fc dataOpts (PLaterdecl tyn ty)) (do
114122 try (lchar '=') <|> do reserved "where"
115− let kw = (if co then "co" else "") ++ "data "
123+ let kw = (if DefaultEliminator `elem` dataOpts then "" else "%noelim ") ++ (if Codata `elem` dataOpts then "co" else "") ++ "data "
116124 let n = show tyn_in ++ " "
117125 let s = kw ++ n
118126 let as = concat (intersperse " " $ map show args) ++ " "
@@ -129,7 +137,7 @@ data_ syn = do (doc, acc, co) <- try (do
129137 do let cty = bindArgs cargs conty
130138 return (doc, x, cty, cfc)) cons
131139 accData acc tyn (map (\ (_, n, _, _) -> n) cons')
132− return $ PData doc syn fc co (PDatadecl tyn ty cons')))
140+ return $ PData doc syn fc dataOpts (PDatadecl tyn ty cons')))
133141 <?> "data type declaration"
134142 where
135143 mkPApp :: FC -> PTerm -> [PTerm] -> PTerm
@@ -137,6 +145,8 @@ data_ syn = do (doc, acc, co) <- try (do
137145 mkPApp fc t xs = PApp fc t (map pexp xs)
138146 bindArgs :: [PTerm] -> PTerm -> PTerm
139147 bindArgs xs t = foldr (PPi expl (MN 0 "t")) t xs
148+ combineDataOpts :: DataOpts -> DataOpts
149+ combineDataOpts opts = if Codata `elem` opts then delete DefaultEliminator opts else opts
140150
141151
142152{- | Parses a type constructor declaration