-- | -- Module: FRP.NetWire.Request -- Copyright: (c) 2011 Ertugrul Soeylemez -- License: BSD3 -- Maintainer: Ertugrul Soeylemez -- -- Unique identifiers. module FRP.NetWire.Request ( -- * Identifiers. identifier ) where import Control.Monad.IO.Class import Control.Concurrent.STM import FRP.NetWire.Wire -- | Choose a unique identifier when switching in and keep it. -- -- Never inhibits. identifier :: MonadIO m => Wire m a Int identifier = mkGen $ \ws _ -> do let reqVar = wsReqVar ws req <- liftIO . atomically $ do req' <- readTVar reqVar let req = succ req' req `seq` writeTVar reqVar (succ req') return req' return (Right req, WConst req)