@@ -1,6 +1,44 @@
1module Regression.T5 (test5) where
1module Regression.T5 (test5) where
3+import Control.Ether.Abbr
5+import qualified Control.Monad.Ether.Implicit as I
6+import qualified Control.Ether.Implicit.Abbr as I
3import Test.Tasty
8import Test.Tasty
9+import Test.Tasty.QuickCheck
11+newtype Counter = Counter Int
12+ deriving (Eq, Ord, Num, Enum)
14+incCounter :: Counter -> Counter
18+ :: (Num a, Ord a) => Ether '[I.R a, I.S Counter] m
27+ I.modify incCounter -- overriden in the base case
28+ b <- I.runReaderT testEther (a - 1)
32+runner :: (Num a, Ord a) => a -> (a, Counter)
33+runner a = I.runState (I.runReaderT testEther a) (0 :: Counter)
35+factorial :: (Num a, Enum a) => a -> a
36+factorial a = product [1..a]
5test5 :: TestTree
38test5 :: TestTree
6−test5 = testGroup "T5:" []
39+test5 = testGroup "T5: Factorial via Ether"
40+ [ testProperty "runner works"
42+ $ let n' = fromIntegral n :: Integer
43+ in runner n' == (factorial n', max 0 (Counter n))