@@ -93,10 +93,79 @@ data PTerm = PQuote Raw
93 | Placeholder
93 | Placeholder
94 deriving Show
94 deriving Show
96+namesIn :: IState -> PTerm -> [Name]
97+namesIn ist tm = nub $ ni [] tm
100+ | not (n `elem` env)
101+ = case lookupCtxt n (idris_implicits ist) of
104+ ni env (PApp f is es) = ni env f ++ concatMap (ni env) (map snd is) ++
105+ concatMap (ni env) es
106+ ni env (PLam n ty sc) = ni env ty ++ ni (n:env) sc
107+ ni env (PPi _ n ty sc) = ni env ty ++ ni (n:env) sc
108+ ni env (PHidden tm) = ni env tm
96-- Dealing with implicit arguments
111-- Dealing with implicit arguments
113+-- Add implicit Pi bindings for any names in the term which appear in an
114+-- argument position.
98implicitise :: IState -> PTerm -> (PTerm, [Name])
116implicitise :: IState -> PTerm -> (PTerm, [Name])
99−implicitise ist tm = (tm, [])
117+implicitise ist tm
118+ = let (declimps, ns) = execState (imps [] tm) ([], []) in
119+ (pibind ns tm, ns ++ reverse declimps)
121+ imps env (PApp f is es)
122+ = do (decls, ns) <- get
123+ let isn = concatMap (namesIn ist) (map snd is)
124+ let esn = concatMap (namesIn ist) es
125+ put (decls, nub (ns ++ ((isn ++ esn) \\ env)))
126+ imps env (PPi Imp n ty sc)
131+ imps env (PPi Exp n ty sc)
134+ imps env (PLam n ty sc)
137+ imps env (PHidden tm) = imps env tm
138+ imps env _ = return ()
141+ pibind (n:ns) sc = PPi Imp n Placeholder (pibind ns sc)
101addImpl :: IState -> PTerm -> PTerm
143addImpl :: IState -> PTerm -> PTerm
102−addImpl ist ptm = ptm
144+addImpl ist ptm = ai [] ptm
146+ ai env (PApp f is es) = let f' = ai env f
147+ is' = map (\ (n, tm) -> (n, ai env tm)) is
148+ es' = map (ai env) es in
150+ ai env (PLam n ty sc) = let ty' = ai env ty
151+ sc' = ai (n:env) sc in
153+ ai env (PPi p n ty sc) = let ty' = ai env ty
154+ sc' = ai (n:env) sc in
156+ ai env (PHidden tm) = PHidden (ai env tm)
159+ aiFn env (PRef f) is es | not (f `elem` env)
160+ = case lookupCtxt f (idris_implicits ist) of
161+ Just ns -> PApp (PRef f) (insertImpl ns is) es
162+ Nothing -> PApp (PRef f) is es
163+ aiFn env f is es = PApp f is es
165+ insertImpl [] given = []
166+ insertImpl (n:ns) given
167+ = case lookup n given of
168+ Just val -> (n, val) : insertImpl ns given
169+ Nothing -> (n, Placeholder) : insertImpl ns given