{-# LANGUAGE NoMonomorphismRestriction, FlexibleContexts, ScopedTypeVariables, BangPatterns #-}
module Main where
import Interlude
import Control.Effects.Signal
import Control.Effects.State
import Control.Effects.Parallel
-- Should infer
ex1 = signal True
-- Should compile
ex2 :: Throws Bool m => m ()
ex2 = throwSignal False
ex3 = do
void $ discardAllExceptions ex1
void $ showAllExceptions ex2
handleException (\(_ :: Bool) -> return ()) ex2
handleSignal (\(_ :: Bool) -> Resume 5) ex1
orderTest :: (Handles Bool m, MonadEffectState Int m, MonadIO m) => m ()
orderTest = do
setState (1 :: Int)
_ :: Either Bool () <- handleToEitherRecursive $ do
setState (2 :: Int)
void $ throwSignal True
setState (3 :: Int)
st :: Int <- getState
print st
inc :: Int -> Int
inc !x = x + 1
task :: (MonadEffectState Int m, MonadIO m) => m Int
task = do
replicateM_ 10000000 (modifyState inc)
st <- getState
st `seq` return st
main :: IO ()
main = do
orderTest & handleException (\(_ :: Bool) -> return ())
& handleStateT (0 :: Int)
orderTest & handleStateT (0 :: Int)
& handleException (\(_ :: Bool) -> return ())
putStrLn "Starting sequential test"
replicateM_ 8 (handleStateT (0 :: Int) task >>= print)
putStrLn "Sequential test done"
putStrLn "Starting parallel test"
handleStateT (0 :: Int) $ do
res <- parallelWithSequence (replicate 8 task)
mapM_ print res
putStrLn "Parallel test done"