packages feed

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)