packages feed

Hs2lib-0.4.8: Tests/Src/Test_StateDemo.hs

{- @@ 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