effect-monad-0.6: examples/Solution2.hs
{-# LANGUAGE RebindableSyntax, TypeOperators, DataKinds, KindSignatures, FlexibleInstances,
ConstraintKinds, FlexibleContexts, TypeFamilies #-}
import Prelude hiding (Monad(..))
import Control.Effect
import Data.Type.Set
import Control.Effect.State
import GHC.Conc.Sync
parMap :: (IsSet f, StateSet f, Writes f ~ '[]) => (a -> State f b) -> [a] -> State f [b]
-- parMap k [] = sub (return [])
parMap k [x] = do y <- k x
return [y]
parMap k (x:xs) = do y <- k x
ys <- parMap k xs
return (y : ys)
parMap2 :: (StateSet f, Writes f ~ '[]) => (a -> State f b) -> [a] -> State f [b]
parMap2 k [] = sub (return [])
parMap2 k (x:xs) = do (y, ys) <- (k x) `par` parMap2 k xs
return (y : ys)