set ready_args ""
set done_args ""
+set do_not_set_this ""
f1 on_ready [list set "[namespace current]::ready_args"]
f1 on_done [list set "[namespace current]::done_args"]
+f1 on_fail [list set "[namespace current]::do_not_set_this"]
+
f1 done foo bar
ok {[f1 is_ready]} "Future ready"
is [lindex $done_args 1] bar "Right second arg"
+is $do_not_set_this "" "on_fail not called"
+
is [f1 get] "foo bar" "get return ok"
+f1 destroy
+
+ten::future f2
+
+f2 done one two three
+
+set done_args ""
+
+f2 on_done [list set "[namespace current]::done_args"]
+
+is $done_args "one two three" "on_done called on completed future"
+
+set ready_args ""
+
+f2 on_ready [list set "[namespace current]::ready_args"]
+
+is $ready_args {::f2} "on_ready called on completed future"
+
+set do_not_set_this ""
+
+f2 on_fail [list set "[namespace current]::do_not_set_this"]
+
+is $do_not_set_this "" "on_fail not called on completed future"
+
done_testing
snit::type ten::future {
- variable callbacks
+ variable callbacks ""
variable is_ready 0
variable result ""
variable failure ""
}
method on_ready {cb_code} {
- lappend callbacks [list ready $cb_code]
+ if [$self is_ready] {
+ eval [concat $cb_code $self]
+ } else {
+ lappend callbacks [list ready $cb_code]
+ }
}
method on_done {cb_code} {
- lappend callbacks [list done $cb_code]
+ if [llength $result] {
+ eval [concat $cb_code [list $result]]
+ } else {
+ lappend callbacks [list done $cb_code]
+ }
}
method on_fail {cb_code} {
- lappend callbacks [list fail $cb_code]
+ if [llength $failure] {
+ eval [concat $cb_code [list $failure]]
+ } else {
+ lappend callbacks [list fail $cb_code]
+ }
}
method MarkReady {} {