'Add a task to run at a later time.
Arguments:
task: can be anything, but generally a callable
at (float or int): epoch seconds to schedule task
Returns:
Future: a future that will be returned with the task when ready'

def add(self, task, at):

    if (task in self._task_map):
        self.remove(task)
    count = next(self._counter)
    future = Future()
    entry = [at, count, (task, future)]
    self._task_map[task] = entry
    heapq.heappush(self._tasks, entry)
    return future
