{- @@ IMPORT "Data.IORef" "Foreign.StablePtr" @@ -} module Tests.Src.Test_StateDemo where import Foreign.StablePtr import Data.IORef type Context a = StablePtr (IORef a) type Env = Context [Int] -- @@ Export initEnv :: IO Env initEnv = newStablePtr =<< newIORef [] -- @@ Export freeEnv :: Env -> IO () freeEnv = freeStablePtr -- @@ Export add :: Env -> Int -> IO () add env val = do env_value <- deRefStablePtr env modifyIORef env_value ((val:) $!) -- @@ Export = sumPrime sum' :: Env -> IO Int sum' env = do env_value <- deRefStablePtr env current <- readIORef env_value return $ sum current main :: IO Int main = do env <- initEnv add env 1 add env 1 add env 1 add env 1 val <- sum' env freeEnv env return val