@@ -7,11 +7,13 @@
77{-# LANGUAGE LambdaCase #-}
88module Main where
99
10+import Data.Functor.Identity
1011import Control.Ether.Tags
1112import Control.Ether.TH
1213import Control.Ether.Wrapped
1314import Control.Monad.Ether.Reader
1415import Control.Monad.Ether.State
16+import Control.Monad.Ether.Implicit.Except.TH
1517import qualified Control.Monad.Ether.Implicit.Reader as I
1618import qualified Control.Monad.Ether.Implicit.State as I
1719import qualified Control.Monad.Ether.Implicit.Except as I
@@ -162,8 +164,21 @@ exceptCore a b = do
162164 then I.throw NegativeLog
163165 else return $ log (a / b)
164166
167+try0 :: m a -> m a
168+try0 = $(try 0)
169+
170+try1 :: Functor m => I.ExceptT e m a -> (e -> a) -> m a
171+try1 = $(try 1)
172+
173+try2 :: Functor m => I.ExceptT e1 (I.ExceptT e2 m) a -> (e1 -> a) -> (e2 -> a) -> m a
174+try2 = $(try 2)
175+
176+try3 :: Functor m => I.ExceptT e1 (I.ExceptT e2 (I.ExceptT e3 m)) a -> (e1 -> a) -> (e2 -> a) -> (e3 -> a) -> m a
177+try3 = $(try 3)
178+
165179exceptCore' :: Double -> Double -> String
166−exceptCore' a b
167− = either (\NegativeLog -> "nl") id
168− $ I.runExcept
169− (either (\DivideByZero -> "dz") show <$> I.runExceptT (exceptCore a b))
180+exceptCore' a b = runIdentity $ do
181+ $(try 2)
182+ (show <$> exceptCore a b)
183+ (\NegativeLog -> "nl")
184+ (\DivideByZero -> "dz")