module PostgREST.Debounce ( makeDebouncer) where import Protolude -- | Make a new debouncer action. An internal "worker" thread runs forever -- ensuring "action" runs when the "trigger" is called. The "action" is only -- executed once over a burst of calls. makeDebouncer :: IO () -> IO (IO ()) makeDebouncer action = do flag <- newEmptyMVar let worker = forever $ do takeMVar flag action trigger = void $ tryPutMVar flag () void $ forkIO worker pure trigger