@@ -1,6 +1,50 @@
11module Regression.T7 (test7) where
22
3+import Data.Monoid
4+import Control.Monad
5+
6+import Control.Monad.Ether
7+import qualified Control.Monad.Writer as T
8+
39import Test.Tasty
10+import Test.Tasty.QuickCheck
11+
12+ethereal "WTag" "wTag"
13+
14+testEther
15+ :: Num a
16+ => T.MonadWriter (Sum a) m
17+ => MonadWriter WTag (Sum a) m
18+ => [a] -> m ()
19+testEther xs = do
20+ forM_ xs $ \x -> do
21+ T.tell (Sum x)
22+ tell wTag (Sum 1)
23+
24+runner1 :: Num a => [a] -> (a, a)
25+runner1 xs =
26+ let (s, c) = T.runWriter . execWriterT wTag $ testEther xs
27+ in (getSum s, getSum c)
28+
29+runner2 :: Num a => [a] -> (a, a)
30+runner2 xs =
31+ let (c, s) = runWriter wTag . T.execWriterT $ testEther xs
32+ in (getSum s, getSum c)
33+
34+triangular :: Integral a => a -> a
35+triangular n = div (n * (n + 1)) 2
436
537test7 :: TestTree
6−test7 = testGroup "T7:" []
38+test7 = testGroup "T7: Triangular via Ether"
39+ [ testProperty "runner₁ works"
40+ $ \n -> property
41+ $ let n' = abs n :: Integer
42+ in runner1 [1..n'] == (n', triangular n')
43+ , testProperty "runner₂ works"
44+ $ \n -> property
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
50+ ]