@@ -51,18 +51,21 @@ parseProg fname = do file <- lift $ readFile fname
5151pFullExpr = do x <- pExpr; eof; return x
5252
5353pDecl :: IParser PDecl
54−pDecl = do d <- pDecl'; lchar ';'; return d
54+pDecl = do d <- pDecl'; lchar ';';
55+ i <- getState
56+ return (fmap (addImpl i) d)
5557
5658--------- Top Level Declarations ---------
5759
5860pDecl' :: IParser PDecl
5961pDecl' = try pFixity
6062 <|> try (do n <- pfName; ty <- pTSig
61− return (PTy n ty))
63+ ty' <- implicit n ty
64+ return (PTy n ty'))
6265 <|> try pData
6366 <|> try pPattern
6467
65−-------- Fixity --------
68+--------- Fixity ---------
6669
6770pFixity :: IParser PDecl
6871pFixity = do f <- fixity; i <- natural; ops <- sepBy1 operator (lchar ',')
@@ -146,15 +149,19 @@ binary name f assoc = Infix (do { reservedOp name; return f }) assoc
146149pData :: IParser PDecl
147150pData = try (do reserved "data"; tyn <- pfName; ty <- pTSig
148151 reserved "where"
152+ ty' <- implicit tyn ty
149153 cons <- sepBy1 pConstructor (lchar '|')
150− return $ PData (PDatadecl tyn ty cons))
154+ return $ PData (PDatadecl tyn ty' cons))
151155 <|> do reserved "data"; tyn <- pfName; args <- many iName
152156 lchar '='
153157 cons <- sepBy1 pSimpleCon (lchar '|')
154158 let conty = mkPApp (PRef tyn) (map PRef args)
155− return $ PData (PDatadecl tyn (bindArgs (map (\a -> PSet) args) PSet)
156− (map (\ (x, cargs) ->
157− (x, bindArgs cargs conty)) cons))
159+ let ty = bindArgs (map (\a -> PSet) args) PSet
160+ ty' <- implicit tyn ty
161+ cons' <- mapM (\ (x, cargs) -> do let cty = bindArgs cargs conty
162+ cty' <- implicit x cty
163+ return (x, cty')) cons
164+ return $ PData (PDatadecl tyn ty' cons')
158165
159166mkPApp t [] = t
160167mkPApp t xs = PApp t [] xs
@@ -188,3 +195,17 @@ pPattern = try (do n <- pfName
188195 rhs <- pExpr
189196 return $ PClause (PApp (PRef (UN [op])) [] [l,r]) rhs
190197
198+-- Dealing with implicit arguments
199+
200+implicit :: Name -> PTerm -> IParser PTerm
201+implicit n ptm
202+ = do i <- getState
203+ let (tm', names) = implicitise i ptm
204+ setState (i { idris_implicits = addDef n names (idris_implicits i) })
205+ return tm'
206+
207+addImplicits :: PTerm -> IParser PTerm
208+addImplicits tm
209+ = do i <- getState
210+ return (addImpl i tm)
211+