@@ -12,6 +12,7 @@ import Idris.ElabTerm
1212import Idris.Coverage
1313import Idris.DataOpts
1414import Idris.Providers
15+import Idris.Primitives
1516import Paths_idris
1617
1718import Core.TT
@@ -210,6 +211,27 @@ elabData info syn doc fc codata (PDatadecl n t_in dcons)
210211 | otherwise = count n ts
211212 mParam args (_ : rest) = Nothing : mParam args rest
212213
214+-- | Elaborate primitives
215+
216+elabPrims :: Idris ()
217+elabPrims = do mapM_ (elabDecl EAll toplevel)
218+ (map (PData "" defaultSyntax (FC "builtin" 0) False)
219+ [inferDecl, unitDecl, falseDecl, pairDecl, eqDecl])
220+ mapM_ elabPrim primitives
221+ where elabPrim :: Prim -> Idris ()
222+ elabPrim (Prim n ty i def sc tot)
223+ = do updateContext (addOperator n ty i (valuePrim def))
224+ setTotality n tot
225+ i <- getIState
226+ putIState i { idris_scprims = (n, sc) : idris_scprims i }
227+
228+ valuePrim :: ([Const] -> Maybe Const) -> [Value] -> Maybe Value
229+ valuePrim prim vals = fmap VConstant (mapM getConst vals >>= prim)
230+
231+ getConst (VConstant c) = Just c
232+ getConst _ = Nothing
233+
234+
213235-- | Elaborate a type provider
214236elabProvider :: ElabInfo -> SyntaxInfo -> FC -> Name -> PTerm -> PTerm -> Idris ()
215237elabProvider info syn fc n ty tm