From 3ccad9ff2d9a774258253056ae99f42b886791cc Mon Sep 17 00:00:00 2001 From: Roman Leshchinskiy Date: Mon, 9 Jul 2007 04:04:06 +0000 Subject: [PATCH] Add failure to vectorisation monad --- compiler/vectorise/Vectorise.hs | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/compiler/vectorise/Vectorise.hs b/compiler/vectorise/Vectorise.hs index 0bf4f66..ed77f9a 100644 --- a/compiler/vectorise/Vectorise.hs +++ b/compiler/vectorise/Vectorise.hs @@ -123,28 +123,42 @@ updVectInfo env guts = guts { mg_vect_info = info' } , let tc_name = tyConName tc , Just tc' <- [lookupNameEnv (vect_tycons env) tc_name]] -newtype VM a = VM { runVM :: Builtins -> VEnv -> DsM (VEnv, a) } +data VResult a = Yes VEnv a | No + +newtype VM a = VM { runVM :: Builtins -> VEnv -> DsM (VResult a) } instance Monad VM where - return x = VM $ \bi env -> return (env, x) + return x = VM $ \bi env -> return (Yes env x) VM p >>= f = VM $ \bi env -> do - (env', x) <- p bi env - runVM (f x) bi env' + r <- p bi env + case r of + Yes env' x -> runVM (f x) bi env' + No -> return No + +noV :: VM a +noV = VM $ \bi env -> return No + +tryV :: VM a -> VM (Maybe a) +tryV (VM p) = VM $ \bi env -> do + r <- p bi env + case r of + Yes env' x -> return (Yes env' (Just x)) + No -> return (Yes env Nothing) liftDs :: DsM a -> VM a -liftDs p = VM $ \bi env -> do { x <- p; return (env, x) } +liftDs p = VM $ \bi env -> do { x <- p; return (Yes env x) } builtin :: (Builtins -> a) -> VM a -builtin f = VM $ \bi env -> return (env, f bi) +builtin f = VM $ \bi env -> return (Yes env (f bi)) readEnv :: (VEnv -> a) -> VM a -readEnv f = VM $ \bi env -> return (env, f env) +readEnv f = VM $ \bi env -> return (Yes env (f env)) setEnv :: VEnv -> VM () -setEnv env = VM $ \_ _ -> return (env, ()) +setEnv env = VM $ \_ _ -> return (Yes env ()) updEnv :: (VEnv -> VEnv) -> VM () -updEnv f = VM $ \_ env -> return (f env, ()) +updEnv f = VM $ \_ env -> return (Yes (f env) ()) newTyVar :: FastString -> Kind -> VM Var newTyVar fs k @@ -163,8 +177,10 @@ vectoriseModule info guts = do builtins <- initBuiltins env <- initVEnv info - (env', guts') <- runVM (vectModule guts) builtins env - return $ updVectInfo env' guts' + r <- runVM (vectModule guts) builtins env + case r of + Yes env' guts' -> return $ updVectInfo env' guts' + No -> return guts vectModule :: ModGuts -> VM ModGuts vectModule guts = return guts -- 1.7.10.4