Parallel scheduler for running actions at designated times
processJobs_ logic

You want to make sure that microsecondTimeout is never negative, since according to the documentation a negative timeout means to wait indefinitely.

To guard against negative timeouts, I would write processJobs_ to have the following logic:

loop:
  if queue is empty:
    call readChan for a new job and add to queue
    goto loop
  else:
    now &lt;- getPosixTime
    if queue minimum &lt;= now:
      fire off all jobs in the queue with a time &lt;= now
      goto loop
    else:
      readResult &lt;- timeoutReadChan ...
      put new job onto the queue
      goto loop


priority queues

You might be interested in this SO question and answers discussing the merits of the various Haskell priority queue packages:

https://stackoverflow.com/questions/6976559/comparison-of-priority-queue-implementations-in-haskell