newEmptyTMVar :: STM (TMVar a)
newEmptyTMVar = do
  t <- newTVar Nothing
  return (TMVar t)
-- >>

-- <<takeTMVar
newEmptyTMVar :: STM (TMVar a)
newEmptyTMVar = do
  t <- newTVar Nothing
  return (TMVar t)
-- >>

-- <<takeTMVar
newEmptyTMVar = do
  t <- newTVar Nothing
  return (TMVar t)
-- >>

-- <<takeTMVar