loop-0.2.0: test/Main.hs
{-# LANGUAGE BangPatterns #-}
import Control.Monad.State.Strict
import Data.IORef
import Data.Word
import Test.Hspec
import Control.Loop (forLoop, numLoop, numLoopFold)
main :: IO ()
main = hspec $ do
describe "forLoop" $ do
it "sum [1..10], strict State" $ do
let res = flip execState 0 $ do
forLoop (1 :: Int) (<= 10) (+1) $ \i -> do
x <- get
put $! x + i
res `shouldBe` sum [1..10]
it "sum [-10..10], strict State" $ do
let res = flip execState 0 $ do
forLoop (-10 :: Int) (<= 10) (+1) $ \i -> do
x <- get
put $! x + i
res `shouldBe` sum [-10..10]
it "over all of Word32, calculating sum, IORef" $ do
ref <- newIORef 0
forLoop (0 :: Word32) (< maxBound) (+1) $ \i -> do
modifyIORef' ref (+i)
res <- readIORef ref
res `shouldBe` 2147483649
it "over all of Word32, calculating sum, strict State" $ do
let res = flip execState 0 $ do
forLoop (0 :: Word32) (< maxBound) (+1) $ \i -> do
x <- get
put $! x + i
res `shouldBe` 2147483649
it "over all of Word32, calculating sum, strict State, i unused" $ do
let res = flip execState 0 $ do
forLoop (0 :: Word32) (< maxBound) (+1) $ \_ -> do
x <- get
put $! x + 1
res `shouldBe` (maxBound :: Word32)
describe "numLoop" $ do
it "is inclusive" $ do
let res = flip execState 0 $ do
numLoop (0 :: Int) 10 $ \i -> do
x <- get
put $! x + i
res `shouldBe` 55
describe "numLoopFold" $ do
it "is inclusive" $ do
numLoopFold (0 :: Int) 10 0 (+) `shouldBe` 55