úΩRequires GHC 7+joeyadams3.14159@gmail.com Safe-Inferred A - is an updatable timer that rings only once.  Create a new 5 that will ring in the given number of microseconds. Set an existing - to ring in the given number of microseconds  (from the time . is called), rather than when it was going to  ring. If the  has already rung, do nothing. Set a  so it will never ring, even if  is used later.  If the  has already rung, do nothing. Block until the  rings. If the  has already rung,  return immediately. Non-blocking version of .  Return  if the  has rung. Use the timeout API in  GHC.Event Use threads and threadDelay:  delayStart1 Fork a thread to wait the given length of time, " then set the TVar.  delayUpdate1 Stop the existing thread and fork a new thread.  delayStop Stop the existing thread. =Fork a thread to perform an action after the given number of  microseconds.   is non-interruptible.  Prevent the  # from performing its action. If it' s too late,  return  (. Otherwise, return an action (namely,  ) for $ cleaning up the underlying thread.   has a nice property: it is non-interruptible. " This means that, in an exception mask#, it will not poll for exceptions.  See Control.Exception for more info.  However, the action returned by   does poll for  exceptions. That's why  ! returns this action rather than M simply doing it. This lets the caller do it outside of a critical section.           stm-delay-0.1Control.Concurrent.STM.DelayDelaynewDelay updateDelay cancelDelay waitDelay tryWaitDelayghc-prim GHC.TypesTrue implEvent implThreadforkTimeoutThreadstopTimeoutThread TimeoutThreadbase Data.MaybeNothing GHC.Conc.Sync killThread DelayImpl delayStart delayUpdate delayStopTimeoutCallback newDelayWith getDelayImplcompat_forkIOUnmasked $fEqDelay