@@ -1,6 +1,50 @@
1module Regression.T7 (test7) where
1module Regression.T7 (test7) where
6+import Control.Monad.Ether
7+import qualified Control.Monad.Writer as T
3import Test.Tasty
9import Test.Tasty
10+import Test.Tasty.QuickCheck
12+ethereal "WTag" "wTag"
16+ => T.MonadWriter (Sum a) m
17+ => MonadWriter WTag (Sum a) m
24+runner1 :: Num a => [a] -> (a, a)
26+ let (s, c) = T.runWriter . execWriterT wTag $ testEther xs
27+ in (getSum s, getSum c)
29+runner2 :: Num a => [a] -> (a, a)
31+ let (c, s) = runWriter wTag . T.execWriterT $ testEther xs
32+ in (getSum s, getSum c)
34+triangular :: Integral a => a -> a
35+triangular n = div (n * (n + 1)) 2
5test7 :: TestTree
37test7 :: TestTree
6−test7 = testGroup "T7:" []
38+test7 = testGroup "T7: Triangular via Ether"
39+ [ testProperty "runner₁ works"
41+ $ let n' = abs n :: Integer
42+ in runner1 [1..n'] == (n', triangular n')
43+ , testProperty "runner₂ works"
45+ $ let n' = abs n :: Integer
46+ in runner2 [1..n'] == (n', triangular n')
47+ , testProperty "runner₁ == runner₂"
48+ $ \(ns :: [Integer]) -> property
49+ $ runner1 ns == runner2 ns