{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE DataKinds #-}
module Array where
import Ivory.Language
import Ivory.Compile.C.CmdlineFrontend
cmodule :: Module
cmodule = package "Array" $ do
incl arrayExample
incl arrayTernary
runArrayExample :: IO ()
runArrayExample = runCompiler [cmodule] [] initialOpts { outDir = Nothing }
arrayExample :: Def('[Ref s ('Array 4 ('Stored Uint8)), Uint8] ':-> ())
arrayExample = proc "arrayExample" $ \arr n -> body $ do
arrayMap $ \ ix -> do
v <- deref (arr ! ix)
store (arr ! ix) (v + n)
arrayTernary :: Def('[IBool] ':-> IFloat)
arrayTernary = proc "arrayTernary" $ \b -> body $ do
a1 <- local (vs 1)
a2 <- local (vs 2)
ares <- assign (b ? (a1, a2))
deref (ares ! 3) >>= ret
where
vs :: IFloat -> Init ('Array 4 ('Stored IFloat))
vs v = iarray (map ival [v, v, v, v])