@@ -30,16 +30,32 @@ data TBPointer = MkTBPointer Ptr
3030-- Statement pointer
3131data StmtPtr = MkStmtPtr Ptr
3232
33−Table : Set
33+Table : Type
3434Table = List (List DBVal)
3535
3636-- ForMap used in to_list_v1
37−forM : Monad m => List a -> (a -> m b) -> m (List b)
38−forM f xs = mapM xs f
37+forM : Applicative f => List a -> (a -> f b) -> f (List b)
38+forM xs f = (sequence (map f xs))
3939
4040-- Neater error handling done using DB
4141data DB a = MkDB (IO (Either String a))
4242
43+instance Functor DB where
44+ fmap f (MkDB action) = MkDB (do res <- action
45+ case res of
46+ Left x => return (Left x)
47+ Right x => return (Right (f x)))
48+
49+instance Applicative DB where
50+ pure = MkDB . return . Right
51+ (MkDB f) <$> (MkDB x) = MkDB (do f' <- f -- FIXME make pretty
52+ case f' of
53+ Left err => return (Left err)
54+ Right op => do x' <- x
55+ case x' of
56+ Left err => return (Left err)
57+ Right v => return (Right (op v)))
58+
4359instance Monad DB where
4460 (MkDB l) >>= k = MkDB (do c <- l
4561 case c of
@@ -299,20 +315,16 @@ get_data (MkDBPointer pointer) row col = do
299315-----------------------------------------------------------------------------
300316
301317toList_v1 : DBPointer -> DB Table
302−toList_v1 db = do
303− nbR <- liftIO (num_row_v2 db)
304− nmC <- liftIO (num_col_v2 db)
305− res <- forM [0..(nbR-1)] (\ i =>
306− forM [0..(nmC-1)] (\ j =>
307− liftIO(get_data db i j)
308−
309− )
310− )
311− return res
312−
313−
318+toList_v1 db = do nbR <- liftIO (num_row_v2 db)
319+ nmC <- liftIO (num_col_v2 db)
320+
321+ res <- liftIO $ forM [0..(nbR-1)] (\ i =>
322+ forM [0..(nmC-1)] (\ j => get_data db i j)
323+ )
324+ return (the (List (List DBVal)) res)
325+
314326strcat : String -> String-> String
315−strcat str1 str2 = (str1 ++ str2)
327+strcat str1 str2 = (str1 ++ str2)
316328
317329-----------------------------------------------------------------------------
318330-- | This version of toList retunrs result from get_table