potoki-core-0.9: library/Potoki/Core/Produce.hs
module Potoki.Core.Produce where
import Potoki.Core.Prelude
import Potoki.Core.Types
import qualified Potoki.Core.Fetch as A
deriving instance Functor Produce
instance Applicative Produce where
pure x = Produce $ do
refX <- newIORef (Just x)
return (A.maybeRef refX, pure ())
(<*>) (Produce leftManaged) (Produce rightManaged) =
Produce ((<*>) <$> leftManaged <*> rightManaged)
instance Alternative Produce where
empty =
Produce (pure empty)
(<|>) (Produce leftManaged) (Produce rightManaged) =
Produce ((<|>) <$> leftManaged <*> rightManaged)
{-# INLINABLE list #-}
list :: [input] -> Produce input
list list =
Produce (liftIO (A.list <$> newIORef list))
{-# INLINE transform #-}
transform :: Transform input output -> Produce input -> Produce output
transform (Transform transformManaged) (Produce produceManaged) =
Produce $ do
fetch <- produceManaged
newFetch <- transformManaged
return (newFetch fetch)