module Data.Drinkery.IO where

import Control.Exception
import Data.Drinkery.Class
import Data.Drinkery.Tap
import Data.IORef

-- | Create a popper from a 'Tap'.
--
-- @popperTap :: CloseRequest r => Tap r s IO -> GivesPopper@
--
popperTap :: (Monoid r, CloseRequest r) => Tap r s IO -> (IO s -> IO ()) -> IO ()
popperTap tap0 needsPopper = do
  vTap <- newIORef tap0
  let popper = do
        t <- readIORef vTap
        (s, t') <- unTap t mempty
        writeIORef vTap t'
        return s
  needsPopper popper `finally` do readIORef vTap >>= close