-----------------------------------------------------------------------------
-- |
-- Module      :  Miso.Subscription.Util
-- Copyright   :  (C) 2016-2025 David M. Johnson
-- License     :  BSD3-style (see the file LICENSE)
-- Maintainer  :  David M. Johnson <code@dmj.io>
-- Stability   :  experimental
-- Portability :  non-portable
----------------------------------------------------------------------------
module Miso.Subscription.Util
   ( -- ** Utilities
     createSub
   ) where
----------------------------------------------------------------------------
import           Control.Exception (bracket)
import           Control.Concurrent.MVar (newEmptyMVar, takeMVar)
-----------------------------------------------------------------------------
import           Miso.Effect
-----------------------------------------------------------------------------
-- | Utility function to allow resource finalization on 'Sub'.
createSub
  :: IO a
  -- ^ Acquire resource
  -> (a -> IO b)
  -- ^ Release resource
  -> Sub action
createSub :: forall a b action. IO a -> (a -> IO b) -> Sub action
createSub IO a
acquire a -> IO b
release = \Sink action
_ -> do
  mvar <- IO (MVar ())
forall a. IO (MVar a)
newEmptyMVar
  bracket acquire release (\a
_ -> MVar () -> IO ()
forall a. MVar a -> IO a
takeMVar MVar ()
mvar)
----------------------------------------------------------------------------