module Control.Monad.MultiWrap (
MultiWrap(..)
)where
import Control.Monad.Trans.Class (MonadTrans(..))
import Control.Monad.Wrap
class (Monad mOut) => MultiWrap mIn mOut a r | mIn mOut a -> r where
mwrap :: (mIn r -> mIn r) -> mOut a -> mOut a
mresultF :: mIn b
-> mOut (a -> r)
mresult :: mIn b -> a -> mOut r
mresult b a = mresultF b >>= return . ($ a)
instance (Monad m) => MultiWrap m m a a where
mwrap = ($)
mresultF _ = return id
instance (MonadTrans t1, Monad (t1 m), MonadWrap t1 a1 a0, Monad m) => MultiWrap m (t1 m) a1 a0 where
mwrap = wrap
mresultF _ = do f1 <- resultF
return $ f1
instance (MonadTrans t2, Monad (t2 (t1 m)), MonadWrap t2 a2 a1, MonadTrans t1, Monad (t1 m), MonadWrap t1 a1 a0, Monad m) => MultiWrap m (t2 (t1 m)) a2 a0 where
mwrap = wrap . wrap
mresultF _ = do f1 <- lift resultF
f2 <- resultF
return $ f1 . f2
instance (MonadTrans t3, Monad (t3 (t2 (t1 m))), MonadWrap t3 a3 a2, MonadTrans t2, Monad (t2 (t1 m)), MonadWrap t2 a2 a1, MonadTrans t1, Monad (t1 m), MonadWrap t1 a1 a0, Monad m) => MultiWrap m (t3 (t2 (t1 m))) a3 a0 where
mwrap = wrap . wrap . wrap
mresultF _ = do f1 <- lift $ lift resultF
f2 <- lift resultF
f3 <- resultF
return $ f1 . f2 . f3
instance (MonadTrans t4, Monad (t4 (t3 (t2 (t1 m)))), MonadWrap t4 a4 a3, MonadTrans t3, Monad (t3 (t2 (t1 m))), MonadWrap t3 a3 a2, MonadTrans t2, Monad (t2 (t1 m)), MonadWrap t2 a2 a1, MonadTrans t1, Monad (t1 m), MonadWrap t1 a1 a0, Monad m) => MultiWrap m (t4 (t3 (t2 (t1 m)))) a4 a0 where
mwrap = wrap . wrap . wrap . wrap
mresultF _ = do f1 <- lift $ lift $ lift resultF
f2 <- lift $ lift resultF
f3 <- lift resultF
f4 <- resultF
return $ f1 . f2 . f3 . f4
instance (MonadTrans t5, Monad (t5 (t4 (t3 (t2 (t1 m))))), MonadWrap t5 a5 a4, MonadTrans t4, Monad (t4 (t3 (t2 (t1 m)))), MonadWrap t4 a4 a3, MonadTrans t3, Monad (t3 (t2 (t1 m))), MonadWrap t3 a3 a2, MonadTrans t2, Monad (t2 (t1 m)), MonadWrap t2 a2 a1, MonadTrans t1, Monad (t1 m), MonadWrap t1 a1 a0, Monad m) => MultiWrap m (t5 (t4 (t3 (t2 (t1 m))))) a5 a0 where
mwrap = wrap . wrap . wrap . wrap . wrap
mresultF _ = do f1 <- lift $ lift $ lift $ lift resultF
f2 <- lift $ lift $ lift resultF
f3 <- lift $ lift resultF
f4 <- lift resultF
f5 <- resultF
return $ f1 . f2 . f3 . f4 . f5
instance (MonadTrans t6, Monad (t6 (t5 (t4 (t3 (t2 (t1 m)))))), MonadWrap t6 a6 a5, MonadTrans t5, Monad (t5 (t4 (t3 (t2 (t1 m))))), MonadWrap t5 a5 a4, MonadTrans t4, Monad (t4 (t3 (t2 (t1 m)))), MonadWrap t4 a4 a3, MonadTrans t3, Monad (t3 (t2 (t1 m))), MonadWrap t3 a3 a2, MonadTrans t2, Monad (t2 (t1 m)), MonadWrap t2 a2 a1, MonadTrans t1, Monad (t1 m), MonadWrap t1 a1 a0, Monad m) => MultiWrap m (t6 (t5 (t4 (t3 (t2 (t1 m)))))) a6 a0 where
mwrap = wrap . wrap . wrap . wrap . wrap . wrap
mresultF _ = do f1 <- lift $ lift $ lift $ lift $ lift resultF
f2 <- lift $ lift $ lift $ lift resultF
f3 <- lift $ lift $ lift resultF
f4 <- lift $ lift resultF
f5 <- lift resultF
f6 <- resultF
return $ f1 . f2 . f3 . f4 . f5 . f6
instance (MonadTrans t7, Monad (t7 (t6 (t5 (t4 (t3 (t2 (t1 m))))))), MonadWrap t7 a7 a6, MonadTrans t6, Monad (t6 (t5 (t4 (t3 (t2 (t1 m)))))), MonadWrap t6 a6 a5, MonadTrans t5, Monad (t5 (t4 (t3 (t2 (t1 m))))), MonadWrap t5 a5 a4, MonadTrans t4, Monad (t4 (t3 (t2 (t1 m)))), MonadWrap t4 a4 a3, MonadTrans t3, Monad (t3 (t2 (t1 m))), MonadWrap t3 a3 a2, MonadTrans t2, Monad (t2 (t1 m)), MonadWrap t2 a2 a1, MonadTrans t1, Monad (t1 m), MonadWrap t1 a1 a0, Monad m) => MultiWrap m (t7 (t6 (t5 (t4 (t3 (t2 (t1 m))))))) a7 a0 where
mwrap = wrap . wrap . wrap . wrap . wrap . wrap . wrap
mresultF _ = do f1 <- lift $ lift $ lift $ lift $ lift $ lift resultF
f2 <- lift $ lift $ lift $ lift $ lift resultF
f3 <- lift $ lift $ lift $ lift resultF
f4 <- lift $ lift $ lift resultF
f5 <- lift $ lift resultF
f6 <- lift resultF
f7 <- resultF
return $ f1 . f2 . f3 . f4 . f5 . f6 . f7
instance (MonadTrans t8, Monad (t8 (t7 (t6 (t5 (t4 (t3 (t2 (t1 m)))))))), MonadWrap t8 a8 a7, MonadTrans t7, Monad (t7 (t6 (t5 (t4 (t3 (t2 (t1 m))))))), MonadWrap t7 a7 a6, MonadTrans t6, Monad (t6 (t5 (t4 (t3 (t2 (t1 m)))))), MonadWrap t6 a6 a5, MonadTrans t5, Monad (t5 (t4 (t3 (t2 (t1 m))))), MonadWrap t5 a5 a4, MonadTrans t4, Monad (t4 (t3 (t2 (t1 m)))), MonadWrap t4 a4 a3, MonadTrans t3, Monad (t3 (t2 (t1 m))), MonadWrap t3 a3 a2, MonadTrans t2, Monad (t2 (t1 m)), MonadWrap t2 a2 a1, MonadTrans t1, Monad (t1 m), MonadWrap t1 a1 a0, Monad m) => MultiWrap m (t8 (t7 (t6 (t5 (t4 (t3 (t2 (t1 m)))))))) a8 a0 where
mwrap = wrap . wrap . wrap . wrap . wrap . wrap . wrap . wrap
mresultF _ = do f1 <- lift $ lift $ lift $ lift $ lift $ lift $ lift resultF
f2 <- lift $ lift $ lift $ lift $ lift $ lift resultF
f3 <- lift $ lift $ lift $ lift $ lift resultF
f4 <- lift $ lift $ lift $ lift resultF
f5 <- lift $ lift $ lift resultF
f6 <- lift $ lift resultF
f7 <- lift resultF
f8 <- resultF
return $ f1 . f2 . f3 . f4 . f5 . f6 . f7 . f8
instance (MonadTrans t9, Monad (t9 (t8 (t7 (t6 (t5 (t4 (t3 (t2 (t1 m))))))))), MonadWrap t9 a9 a8, MonadTrans t8, Monad (t8 (t7 (t6 (t5 (t4 (t3 (t2 (t1 m)))))))), MonadWrap t8 a8 a7, MonadTrans t7, Monad (t7 (t6 (t5 (t4 (t3 (t2 (t1 m))))))), MonadWrap t7 a7 a6, MonadTrans t6, Monad (t6 (t5 (t4 (t3 (t2 (t1 m)))))), MonadWrap t6 a6 a5, MonadTrans t5, Monad (t5 (t4 (t3 (t2 (t1 m))))), MonadWrap t5 a5 a4, MonadTrans t4, Monad (t4 (t3 (t2 (t1 m)))), MonadWrap t4 a4 a3, MonadTrans t3, Monad (t3 (t2 (t1 m))), MonadWrap t3 a3 a2, MonadTrans t2, Monad (t2 (t1 m)), MonadWrap t2 a2 a1, MonadTrans t1, Monad (t1 m), MonadWrap t1 a1 a0, Monad m) => MultiWrap m (t9 (t8 (t7 (t6 (t5 (t4 (t3 (t2 (t1 m))))))))) a9 a0 where
mwrap = wrap . wrap . wrap . wrap . wrap . wrap . wrap . wrap . wrap
mresultF _ = do f1 <- lift $ lift $ lift $ lift $ lift $ lift $ lift $ lift resultF
f2 <- lift $ lift $ lift $ lift $ lift $ lift $ lift resultF
f3 <- lift $ lift $ lift $ lift $ lift $ lift resultF
f4 <- lift $ lift $ lift $ lift $ lift resultF
f5 <- lift $ lift $ lift $ lift resultF
f6 <- lift $ lift $ lift resultF
f7 <- lift $ lift resultF
f8 <- lift resultF
f9 <- resultF
return $ f1 . f2 . f3 . f4 . f5 . f6 . f7 . f8 . f9