packages feed

churros-0.1.6.0: src/Control/Churro/Transport/MVar.hs

{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -Wno-orphans #-}
{-# LANGUAGE BlockArguments #-}

-- | MVar Transport Instance. Blocks when item hasn't been consumed downstream.

module Control.Churro.Transport.MVar where
    
import Control.Churro.Types
import Control.Churro.Prelude

import Control.Concurrent
import Data.Void

instance Transport MVar where
    data In  MVar a = ChanIn  (MVar a)
    data Out MVar a = ChanOut (MVar a)
    yank (ChanOut c) = takeMVar c
    yeet (ChanIn  c) = putMVar  c
    flex = do 
        c <- newEmptyMVar
        return (ChanIn c, ChanOut c)

type ChurroMVar a = Churro a MVar

-- | Convenience function for running a Churro with an MVar Transport.
-- 
runWaitMVar :: ChurroMVar a Void Void -> IO a
runWaitMVar = runWait

-- | Convenience function for running a Churro into a List with an MVar Transport.
-- 
runWaitListMVar :: ChurroMVar () Void o -> IO [o]
runWaitListMVar = runWaitList