packages feed

loops-0.2.0.2: test/Test/Sum.hs

{-# LANGUAGE DataKinds #-}

module Test.Sum where

import qualified Control.Monad.Loop as LoopT
import qualified Control.Monad.Loop.Unroll as Unroll
import Data.Foldable
import Prelude hiding (foldr)
import Test.Tasty.QuickCheck

prop_sum_foldl_LoopT :: [Int] -> Property
prop_sum_foldl_LoopT xs =
    foldl' (+) 0 xs === foldl' (+) 0 (LoopT.forEach xs :: LoopT.Loop Int)

prop_sum_foldr_LoopT :: [Int] -> Property
prop_sum_foldr_LoopT xs =
    foldr (+) 0 xs === foldr (+) 0 (LoopT.forEach xs :: LoopT.Loop Int)

prop_sum_foldl_LoopT_Unroll :: [Int] -> Property
prop_sum_foldl_LoopT_Unroll xs =
    foldl' (+) 0 xs === foldl' (+) 0 (Unroll.forEach unroll xs :: Unroll.Loop Int)
  where
    unroll :: Unroll.Unroll 8
    unroll = Unroll.Unroll

prop_sum_foldr_LoopT_Unroll :: [Int] -> Property
prop_sum_foldr_LoopT_Unroll xs =
    foldr (+) 0 xs === foldr (+) 0 (Unroll.forEach unroll xs :: Unroll.Loop Int)
  where
    unroll :: Unroll.Unroll 8
    unroll = Unroll.Unroll

prop_break_order :: [Int] -> Property
prop_break_order xs =
    foldl' (+) 0 before === foldl' (+) 0 after
  where
    before = LoopT.loop $ do
      x <- LoopT.forEach xs
      if x < 10 then LoopT.continue 10 else LoopT.break_
    after = LoopT.loop $ do
      x <- LoopT.forEach xs
      return ()
      if x < 10 then LoopT.continue 10 else LoopT.break_