module TMVar where import Control.Concurrent.STM hiding (TMVar, takeTMVar) -- <> newTMVar :: a -> STM (TMVar a) newTMVar a = do t <- newTVar (Just a) return (TMVar t) -- <> -- < STM a takeTMVar (TMVar t) = do m <- readTVar t -- <1> case m of Nothing -> retry -- <2> Just a -> do writeTVar t Nothing -- <3> return a -- >> -- < a -> STM () putTMVar (TMVar t) a = do m <- readTVar t case m of Nothing -> do writeTVar t (Just a) return () Just _ -> retry -- >> -- < TMVar b -> STM (Either a b) takeEitherTMVar ma mb = fmap Left (takeTMVar ma) `orElse` fmap Right (takeTMVar mb) -- >>