;; LGPL3+ AlexJGriffith
;; Execute a callback every n seconds

;; Example:
;; (local {:new new-every} (require :every))
;; (local every (new-every love.timer.getTime))
;; (every 2 #(print "Hello World!"))
;; (fn love.update [_dt] (every:iter))

(local M {})

(fn M.iter [self]
  (local clock (self.clock))
  (each [index [end period callback] (ipairs self)]
    (when (> clock end)
      (callback)
      (tset self index 1 (+ clock period)))))

(fn M.add [self period callback]
  (table.insert self [(+ (self.clock) period) period callback]))

(fn new [clock]
  (setmetatable
   {: clock}
   {:__index M :__call M.add}))

{: new}
