moffy-0.1.0.0: src/Control/Moffy/NoThreadId.hs
{-# LANGUAGE MonoLocalBinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}
module Control.Moffy.NoThreadId (
-- * Applicative
app, iapp,
-- * Parallel
first, at, break, until, indexBy,
-- * Copies
parList ) where
import Prelude hiding (break, until)
import Control.Moffy.Internal.Sig (
app_, iapp_, at_, break_, until_, indexBy_, parList_ )
import Control.Moffy.Internal.Sig.Type (Sig, ISig)
import Control.Moffy.Internal.React (Firstable, first_)
import Control.Moffy.Internal.React.Type (React, noThreadId)
import Data.Type.Set ((:+:))
import Data.OneOrMore (Mergeable)
import Data.Or (Or)
---------------------------------------------------------------------------
-- * APPLICATIVE
-- * PARALLEL
-- * COPIES
---------------------------------------------------------------------------
-- APPLICATIVE
---------------------------------------------------------------------------
infixl 4 `app`, `iapp`
app :: ((es :+: es) ~ es, Mergeable es es es, Monoid r) =>
Sig s es (a -> b) r -> Sig s es a r -> Sig s es b r
app = app_ noThreadId
iapp :: ((es :+: es) ~ es, Mergeable es es es, Semigroup r) =>
ISig s es (a -> b) r -> ISig s es a r -> ISig s es b r
iapp = iapp_ noThreadId
---------------------------------------------------------------------------
-- PARALLEL
---------------------------------------------------------------------------
infixr 8 `first`
first :: Firstable es es' a b =>
React s es a -> React s es' b -> React s (es :+: es') (Or a b)
first = first_ noThreadId
infixr 7 `at`
at :: Firstable es es' (ISig s (es :+: es') a r) r' =>
Sig s es a r -> React s es' r' ->
React s (es :+: es') (Either r (Maybe a, r'))
at = at_ noThreadId
infixl 7 `break`, `until`
break :: Firstable es es' (ISig s (es :+: es') a r) r' =>
Sig s es a r -> React s es' r' ->
Sig s (es :+: es') a (Either r (Maybe a, r'))
break = break_ noThreadId
until :: Firstable es es' (ISig s (es :+: es') a r) r' =>
Sig s es a r -> React s es' r' ->
Sig s (es :+: es') a (Either r (a, r'))
until = until_ noThreadId
infixl 7 `indexBy`
indexBy ::
Firstable es es' (ISig s (es :+: es') a r) (ISig s (es :+: es') b r') =>
Sig s es a r -> Sig s es' b r' ->
Sig s (es :+: es') (a, b) (Either r (Maybe a, r'))
indexBy = indexBy_ noThreadId
---------------------------------------------------------------------------
-- COPIES
---------------------------------------------------------------------------
parList :: ((es :+: es) ~ es, Mergeable es es es) =>
Sig s es (ISig s es a r) r' -> Sig s es [a] ([r], r')
parList = parList_ noThreadId