-----------------------------------------------------------------------------
{-# LANGUAGE OverloadedStrings #-}
-----------------------------------------------------------------------------
-- |
-- 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.Monad.IO.Class (liftIO)
import           Control.Concurrent.MVar (newEmptyMVar, takeMVar)
import           Language.Javascript.JSaddle (JSM, bracket)
-----------------------------------------------------------------------------
import           Miso.Effect
-----------------------------------------------------------------------------
-- | Utility function to allow resource finalization on 'Sub'.
createSub
  :: JSM a
  -- ^ Acquire resource
  -> (a -> JSM b)
  -- ^ Release resource
  -> Sub action
createSub :: forall a b action. JSM a -> (a -> JSM b) -> Sub action
createSub JSM a
acquire a -> JSM b
release = \Sink action
_ -> do
  mvar <- IO (MVar ()) -> JSM (MVar ())
forall a. IO a -> JSM a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO (MVar ())
forall a. IO (MVar a)
newEmptyMVar
  bracket acquire release (\a
_ -> IO () -> JSM ()
forall a. IO a -> JSM a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (MVar () -> IO ()
forall a. MVar a -> IO a
takeMVar MVar ()
mvar))
----------------------------------------------------------------------------