module Control.Monad.MultiLift (
MultiLift(..)
)where
import Control.Monad.Trans.Class (MonadTrans(..))
class MultiLift mIn mOut where
mlift :: mIn a -> mOut a
instance MultiLift m m where
mlift = id
instance (MonadTrans t1, Monad (t1 m), Monad m) => MultiLift m (t1 m) where
mlift = lift
instance (MonadTrans t2, Monad (t2 (t1 m)), MonadTrans t1, Monad (t1 m), Monad m) => MultiLift m (t2 (t1 m)) where
mlift = lift . lift
instance (MonadTrans t3, Monad (t3 (t2 (t1 m))), MonadTrans t2, Monad (t2 (t1 m)), MonadTrans t1, Monad (t1 m), Monad m) => MultiLift m (t3 (t2 (t1 m))) where
mlift = lift . lift . lift
instance (MonadTrans t4, Monad (t4 (t3 (t2 (t1 m)))), MonadTrans t3, Monad (t3 (t2 (t1 m))), MonadTrans t2, Monad (t2 (t1 m)), MonadTrans t1, Monad (t1 m), Monad m) => MultiLift m (t4 (t3 (t2 (t1 m)))) where
mlift = lift . lift . lift . lift
instance (MonadTrans t5, Monad (t5 (t4 (t3 (t2 (t1 m))))), MonadTrans t4, Monad (t4 (t3 (t2 (t1 m)))), MonadTrans t3, Monad (t3 (t2 (t1 m))), MonadTrans t2, Monad (t2 (t1 m)), MonadTrans t1, Monad (t1 m), Monad m) => MultiLift m (t5 (t4 (t3 (t2 (t1 m))))) where
mlift = lift . lift . lift . lift . lift
instance (MonadTrans t6, Monad (t6 (t5 (t4 (t3 (t2 (t1 m)))))), MonadTrans t5, Monad (t5 (t4 (t3 (t2 (t1 m))))), MonadTrans t4, Monad (t4 (t3 (t2 (t1 m)))), MonadTrans t3, Monad (t3 (t2 (t1 m))), MonadTrans t2, Monad (t2 (t1 m)), MonadTrans t1, Monad (t1 m), Monad m) => MultiLift m (t6 (t5 (t4 (t3 (t2 (t1 m)))))) where
mlift = lift . lift . lift . lift . lift . lift
instance (MonadTrans t7, Monad (t7 (t6 (t5 (t4 (t3 (t2 (t1 m))))))), MonadTrans t6, Monad (t6 (t5 (t4 (t3 (t2 (t1 m)))))), MonadTrans t5, Monad (t5 (t4 (t3 (t2 (t1 m))))), MonadTrans t4, Monad (t4 (t3 (t2 (t1 m)))), MonadTrans t3, Monad (t3 (t2 (t1 m))), MonadTrans t2, Monad (t2 (t1 m)), MonadTrans t1, Monad (t1 m), Monad m) => MultiLift m (t7 (t6 (t5 (t4 (t3 (t2 (t1 m))))))) where
mlift = lift . lift . lift . lift . lift . lift . lift
instance (MonadTrans t8, Monad (t8 (t7 (t6 (t5 (t4 (t3 (t2 (t1 m)))))))), MonadTrans t7, Monad (t7 (t6 (t5 (t4 (t3 (t2 (t1 m))))))), MonadTrans t6, Monad (t6 (t5 (t4 (t3 (t2 (t1 m)))))), MonadTrans t5, Monad (t5 (t4 (t3 (t2 (t1 m))))), MonadTrans t4, Monad (t4 (t3 (t2 (t1 m)))), MonadTrans t3, Monad (t3 (t2 (t1 m))), MonadTrans t2, Monad (t2 (t1 m)), MonadTrans t1, Monad (t1 m), Monad m) => MultiLift m (t8 (t7 (t6 (t5 (t4 (t3 (t2 (t1 m)))))))) where
mlift = lift . lift . lift . lift . lift . lift . lift . lift
instance (MonadTrans t9, Monad (t9 (t8 (t7 (t6 (t5 (t4 (t3 (t2 (t1 m))))))))), MonadTrans t8, Monad (t8 (t7 (t6 (t5 (t4 (t3 (t2 (t1 m)))))))), MonadTrans t7, Monad (t7 (t6 (t5 (t4 (t3 (t2 (t1 m))))))), MonadTrans t6, Monad (t6 (t5 (t4 (t3 (t2 (t1 m)))))), MonadTrans t5, Monad (t5 (t4 (t3 (t2 (t1 m))))), MonadTrans t4, Monad (t4 (t3 (t2 (t1 m)))), MonadTrans t3, Monad (t3 (t2 (t1 m))), MonadTrans t2, Monad (t2 (t1 m)), MonadTrans t1, Monad (t1 m), Monad m) => MultiLift m (t9 (t8 (t7 (t6 (t5 (t4 (t3 (t2 (t1 m))))))))) where
mlift = lift . lift . lift . lift . lift . lift . lift . lift . lift