# every --
# Cheap rescheduler. (c) Jeffrey Hobbs
#
# every::schedule <time> cmd; # cmd is a one arg (cmd as list)
# schedules $cmd to be run every <time> 1000ths of a sec
# IOW, [::every::schedule 1000 "puts hello"] prints hello every sec
# every::cancel pattern
# cancels cmd matching the glob pattern
# every::info ?pattern?
# returns info about commands in pairs of "time cmd time cmd ..."
#
namespace eval ::every {}
proc ::every::schedule {time cmd} {
if {![string is integer -strict $time]} {
return -code error "usage: [lindex [::info level 0] 0] time command"
}
# A time was given, so schedule a command to run every $time msecs
variable ID
if {[string compare {} $cmd]} {
set ID($cmd) [list $time [after $time [list ::every::_do $cmd]]]
}
}
proc ::every::_do {cmd} {
variable ID
if {[::info exists ID($cmd)]} {
uplevel \#0 $cmd
set time [lindex $ID($cmd) 0]
set ID($cmd) [list $time [after $time [list ::every::_do $cmd]]]
}
}
proc ::every::cancel {pattern} {
variable ID
foreach i [array names ID $pattern] {
after cancel [lindex $ID($i) 1]
unset ID($i)
}
}
proc ::every::info {{pattern *}} {
variable ID
set result {}
foreach i [array names ID $pattern] {
lappend result [lindex $ID($i) 0] [lindex $ID($i) 1]
}
return $result
}