@@ -10,6 +10,10 @@ import Debug.Trace
11import Util.DynamicLinker
11import Util.DynamicLinker
13+import Control.Monad.Trans
14-- | Attempt to perform a side effect. Return either Just the next step in
18-- | Attempt to perform a side effect. Return either Just the next step in
15-- evaluation (after performing the side effect through IO), or Nothing if no
19-- evaluation (after performing the side effect through IO), or Nothing if no
@@ -41,8 +45,7 @@ call (FFun name argTypes retType) args = undefined
41foreignFromTT :: TT Name -> Maybe Foreign
45foreignFromTT :: TT Name -> Maybe Foreign
42foreignFromTT t = case (unApply t) of
46foreignFromTT t = case (unApply t) of
43 (_, [(Constant (Str name)), args, ret]) ->
47 (_, [(Constant (Str name)), args, ret]) ->
44− do trace (show $ unList args) $ return ()
45− argTy <- unList args
48+ do argTy <- unList args
46 argFTy <- sequence $ map getFTy argTy
49 argFTy <- sequence $ map getFTy argTy
47 retFTy <- getFTy ret
50 retFTy <- getFTy ret
48 return $ FFun name argFTy retFTy
51 return $ FFun name argFTy retFTy
@@ -67,9 +70,29 @@ unList tm = case unApply tm of
67 return $ x:rest
70 return $ x:rest
68 (f, args) -> Nothing
71 (f, args) -> Nothing
73+toConst :: TT Name -> Maybe Const
74+toConst (Constant c) = Just c
70stepForeign :: [TT Name] -> Idris (TT Name)
77stepForeign :: [TT Name] -> Idris (TT Name)
71−stepForeign (ty:fn:args) = do iputStrLn $ "FOREIGN CALL " ++ show (ty:fn:args)
78+stepForeign (ty:fn:args) = do iputStrLn $ show $ foreignFromTT fn
72− iputStrLn $ show $ foreignFromTT fn
79+ iputStrLn $ show $ sequence $ map toConst args
73 iputStrLn ""
80 iputStrLn ""
74 return $ mkApp (P Bound (UN "mkForeign") Erased) args
81 return $ mkApp (P Bound (UN "mkForeign") Erased) args
75−stepForeign _ = fail "Tried to call foreign function that wasn't mkForeign"
82+stepForeign _ = fail "Tried to call foreign function that wasn't mkForeign"
84+mapMaybeM :: Monad m => (a -> m (Maybe b)) -> [a] -> m [b]
85+mapMaybeM f [] = return []
86+mapMaybeM f (x:xs) = do rest <- mapMaybeM f xs
89+ Just x'' -> return (x'':rest)
90+ Nothing -> return rest
92+findForeign :: String -> Idris (Maybe ForeignFun)
93+findForeign fn = do i <- getIState
94+ let libs = idris_dynamic_libs i
95+ fns <- mapMaybeM (lift . tryLoadFn fn) libs
97+ [f] -> return (Just f)