packages feed

purescript-0.9.1: examples/passing/SequenceDesugared.purs

module Main where

import Prelude
import Control.Monad.Eff
import Control.Monad.Eff.Console (log)

data List a = Cons a (List a) | Nil

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

sequenceListSeq :: forall m a. (Monad m) => List (m a) -> m (List a)
sequenceListSeq Nil = pure Nil
sequenceListSeq (Cons x xs) = Cons <$> x <*> sequenceListSeq xs

sequenceList :: Sequence List
sequenceList = Sequence (sequenceListSeq)

sequenceList' :: Sequence List
sequenceList' = Sequence ((\val -> case val of
  Nil -> pure Nil
  Cons x xs -> Cons <$> x <*> sequence sequenceList' xs))

sequenceList'' :: Sequence List
sequenceList'' = Sequence (sequenceListSeq :: forall m a. (Monad m) => List (m a) -> m (List a))

sequenceList''' :: Sequence List
sequenceList''' = Sequence ((\val -> case val of
  Nil -> pure Nil
  Cons x xs -> Cons <$> x <*> sequence sequenceList''' xs) :: forall m a. (Monad m) => List (m a) -> m (List a))

main = do
  sequence sequenceList $ Cons (log "Done") Nil
  sequence sequenceList' $ Cons (log "Done") Nil
  sequence sequenceList'' $ Cons (log "Done") Nil
  sequence sequenceList''' $ Cons (log "Done") Nil