packages feed

purescript-0.6.9: examples/passing/SequenceDesugared.purs

module Main where

import Control.Monad.Eff

data Sequence t = Sequence (forall m a. (Monad m) => t (m a) -> m (t a))

sequence :: forall t. Sequence t -> (forall m a. (Monad m) => t (m a) -> m (t a))
sequence (Sequence s) = s

sequenceArraySeq :: forall m a. (Monad m) => Array (m a) -> m (Array a)
sequenceArraySeq [] = pure []
sequenceArraySeq (x:xs) = (:) <$> x <*> sequenceArraySeq xs

sequenceArray :: Sequence []
sequenceArray = Sequence (sequenceArraySeq)

sequenceArray' :: Sequence []
sequenceArray' = Sequence ((\val -> case val of
  [] -> pure []
  (x:xs) -> (:) <$> x <*> sequence sequenceArray' xs))

sequenceArray'' :: Sequence []
sequenceArray'' = Sequence (sequenceArraySeq :: forall m a. (Monad m) => Array (m a) -> m (Array a))

sequenceArray''' :: Sequence []
sequenceArray''' = Sequence ((\val -> case val of
  [] -> pure []
  (x:xs) -> (:) <$> x <*> sequence sequenceArray''' xs) :: forall m a. (Monad m) => Array (m a) -> m (Array a))

main = do
  sequence sequenceArray $ [Debug.Trace.trace "Done"]
  sequence sequenceArray' $ [Debug.Trace.trace "Done"]
  sequence sequenceArray'' $ [Debug.Trace.trace "Done"]
  sequence sequenceArray''' $ [Debug.Trace.trace "Done"]