packages feed

raw-feldspar-0.3: tests/Compilation.hs

{-# LANGUAGE ScopedTypeVariables #-}

import qualified Prelude
import Control.Monad.Trans

import Feldspar.Run
import Feldspar.Data.Vector
import Feldspar.Data.Option



--------------------------------------------------------------------------------
-- * Option
--------------------------------------------------------------------------------

-- | Safe indexing in a 'Manifest' vector
indexO :: (Syntax a, Monad m) => Manifest a -> Data Index -> OptionT m a
indexO vec i = guarded "indexO: out of bounds" (i<length vec) (vec!i)

funO :: Monad m => Manifest (Data Int32) -> Data Index -> OptionT m (Data Int32)
funO vec i = do
    a <- indexO vec i
    b <- indexO vec (i+1)
    c <- indexO vec (i+2)
    d <- indexO vec (i+4)
    return (a+b+c+d)

test_option :: Run ()
test_option = do
    vec <- manifestFresh $ fmap i2n (1...10)
    i   <- readStd
    printf "%d\n" $ fromSome $ funO vec i

test_optionM :: Run ()
test_optionM = do
    vec <- manifestFresh $ fmap i2n (1...10)
    i   <- readStd
    caseOptionM (funO vec i)
        printf
        (printf "%d\n")

readPositive :: OptionT Run (Data Int32)
readPositive = do
    i <- lift readStd
    guarded "negative" (i>=0) i

test_optionT = optionT printf (\_ -> return ()) $ do
    vec  <- manifestFresh $ fmap i2n (1...10)
    len  <- readPositive
    sumr <- initRef (0 :: Data Int32)
    for (0, 1, Excl len) $ \i -> do
        lift $ printf "reading index %d\n" i
        x <- indexO vec (i2n i)
        modifyRef sumr (+x)
    s <- unsafeFreezeRef sumr
    lift $ printf "%d" s



--------------------------------------------------------------------------------
-- * Misc.
--------------------------------------------------------------------------------

-- Test that constant folding does not attempt to fold array indexing
test_constFoldArr :: Run ()
test_constFoldArr = do
    arr <- constIArr [1..10]
    let a = (arrIx arr 0 == arrIx arr 1) ? arrIx arr 100 $ arrIx arr 2
    printf "%d\n" (a :: Data Int32)



--------------------------------------------------------------------------------

main = do
    tag "test_option"       >> compareCompiled test_option  (runIO test_option)  "5\n"
    tag "test_option"       >> compareCompiled test_option  (runIO test_option)  "6\n"
    tag "test_optionM"      >> compareCompiled test_optionM (runIO test_option)  "5\n"
    tag "test_optionM"      >> compareCompiled test_optionM (runIO test_optionM) "5\n"
    tag "test_optionT"      >> compareCompiled test_optionT (runIO test_optionT) "10\n"
    tag "test_constFoldArr" >> compareCompiled test_constFoldArr (runIO test_constFoldArr) ""
  where
    tag str = putStrLn $ "---------------- tests/Compilation.hs/" Prelude.++ str Prelude.++ "\n"