@@ -1,18 +1,26 @@
11{-# LANGUAGE TypeFamilies #-}
22{-# LANGUAGE FlexibleContexts #-}
33{-# LANGUAGE EmptyDataDecls #-}
4+{-# LANGUAGE TemplateHaskell #-}
5+{-# LANGUAGE ConstraintKinds #-}
46module Main where
57
8+import Control.Ether.TH
69import Control.Monad.Ether.Reader
710
811import Data.Proxy
912import Data.Functor.Identity
10−import Control.Ether.Core
1113
1214import Test.Tasty
1315import Test.Tasty.QuickCheck
1416import Test.QuickCheck.Function
1517
18+etherealReader "AmountTag" "runAmountT" "askAmount" ''Int
19+type MonadAmount = MonadEtherReader AmountTag
20+
21+etherealReader "CountTag" "runCountT" "askCount" ''Integer
22+type MonadCount = MonadEtherReader CountTag
23+
1624main :: IO ()
1725main = defaultMain suite
1826
@@ -29,42 +37,24 @@ layeredLocalLeft, layeredLocalRight
2937
3038layeredLocalLeft k f a1 a2 = property (direct == indirect)
3139 where
32− run = runIdentity . flip runAmountT a1 . flip runAmount2T a2
40+ run = runIdentity . flip runAmountT a1 . flip runCountT a2
3341 direct = apply k (fromIntegral a1, apply f a2)
3442 indirect = run $ layeredLocalCore (apply f) (\n m -> apply k (fromIntegral n, m))
3543
3644layeredLocalRight k f a1 a2 = property (direct == indirect)
3745 where
38− run = runIdentity . flip runAmount2T a2 . flip runAmountT a1
46+ run = runIdentity . flip runCountT a2 . flip runAmountT a1
3947 direct = apply k (fromIntegral a1, apply f a2)
4048 indirect = run $ layeredLocalCore (apply f) (\n m -> apply k (fromIntegral n, m))
4149
4250layeredLocalCore
43− :: (MonadEtherReader AmountTag m, MonadEtherReader Amount2Tag m)
51+ :: (MonadAmount m, MonadCount m)
4452 => (Integer -> Integer) -> (Int -> Integer -> a) -> m a
4553layeredLocalCore f g = do
4654 n <- askAmount
47− m <- etherLocal (Proxy :: Proxy Amount2Tag) f askAmount2
55+ m <- etherLocal (Proxy :: Proxy CountTag) f askCount
4856 return (g n m)
4957
50−data AmountTag
51−type instance EtherData AmountTag = Int
52−
53−runAmountT :: EtherReaderT AmountTag m a -> EtherData AmountTag -> m a
54−runAmountT = runEtherReaderT (Proxy :: Proxy AmountTag)
55−
56−askAmount :: MonadEtherReader AmountTag m => m (EtherData AmountTag)
57−askAmount = etherAsk (Proxy :: Proxy AmountTag)
58−
59−data Amount2Tag
60−type instance EtherData Amount2Tag = Integer
61−
62−runAmount2T :: EtherReaderT Amount2Tag m a -> EtherData Amount2Tag -> m a
63−runAmount2T = runEtherReaderT (Proxy :: Proxy Amount2Tag)
64−
65−askAmount2 :: MonadEtherReader Amount2Tag m => m (EtherData Amount2Tag)
66−askAmount2 = etherAsk (Proxy :: Proxy Amount2Tag)
67−
6858-- this should not compile
6959z :: IO Int
7060z = runAmountT (runAmountT (runAmountT askAmount 20) 10) 5