Login
7 branches 0 tags
Ben (Win10) Removed tests depending on true/false being there 5befd70 4 years ago 197 Commits
nujel / stdlib / async.nuj
;; Contains everything related to the yield/coroutine system

[def yield-queue #nil]

[defun yield [pred fun] "Evaluates FUN once PRED is true"
        [set! yield-queue [cons [cons pred fun] yield-queue]]
        #t
]

[defun yield-run []
       "Executes pending coroutines if their predicate evaluates to #t"
       [def l yield-queue]
       [def new #nil]
       [def cur #nil]
       [set! yield-queue #nil]
       [while l
              [set! cur [car l]]
              [if [[car cur]]
                  [[cdr cur]]
                  [set! yield-queue [cons cur yield-queue]]]
              [set! l [cdr l]]
       ]
]

[defun timeout [milliseconds] "Returns a function that evaluates to true once MILLISECONDS have passed"
        [def goal [+ [time/milliseconds] milliseconds]]
        [λ [] [> [time/milliseconds] goal]]
]

[defun event-bind [event-name handler] "Binds handler lambda to event-name"
        [set! [str->sym event-name] [cons handler [resolve [str->sym event-name]]]]
]

[defun event-clear [event-name] "Clears all event handlers for event-name"
        [set! [str->sym event-name] '[]]
]

[defun event-fire-iter [l v] "Iter for event-fire"
        [cond [[nil? l] #t]
              [#t [apply [car l] v] [event-fire-iter [cdr l] v]]
        ]
]

[defun event-fire [event-name ...val] "Applies ...val to all event handlers associated with event-name"
        [event-fire-iter [resolve [str->sym event-name]] ...val]
]