----------------------------------------------------------------------------- {-# 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)) ----------------------------------------------------------------------------