@@ -0,0 +1,34 @@
1+module Main where
2+
3+import Control.Monad.Eff
4+
5+data Sequence t = Sequence (forall m a. (Monad m) => t (m a) -> m (t a))
6+
7+sequence :: forall t. Sequence t -> (forall m a. (Monad m) => t (m a) -> m (t a))
8+sequence (Sequence s) = s
9+
10+sequenceArraySeq :: forall m a. (Monad m) => Array (m a) -> m (Array a)
11+sequenceArraySeq [] = pure []
12+sequenceArraySeq (x:xs) = (:) <$> x <*> sequenceArraySeq xs
13+
14+sequenceArray :: Sequence []
15+sequenceArray = Sequence (sequenceArraySeq)
16+
17+sequenceArray' :: Sequence []
18+sequenceArray' = Sequence ((\val -> case val of
19+ [] -> pure []
20+ (x:xs) -> (:) <$> x <*> sequence sequenceArray' xs))
21+
22+sequenceArray'' :: Sequence []
23+sequenceArray'' = Sequence (sequenceArraySeq :: forall m a. (Monad m) => Array (m a) -> m (Array a))
24+
25+sequenceArray''' :: Sequence []
26+sequenceArray''' = Sequence ((\val -> case val of
27+ [] -> pure []
28+ (x:xs) -> (:) <$> x <*> sequence sequenceArray''' xs) :: forall m a. (Monad m) => Array (m a) -> m (Array a))
29+
30+main = do
31+ sequence sequenceArray $ [Debug.Trace.trace "Done"]
32+ sequence sequenceArray' $ [Debug.Trace.trace "Done"]
33+ sequence sequenceArray'' $ [Debug.Trace.trace "Done"]
34+ sequence sequenceArray''' $ [Debug.Trace.trace "Done"]