builtin-programs/fswatch.folk

# Watch for builtin-programs/ changes.
try {
    set fd [open [list |fswatch --recursive --event Updated --event Created \
                      builtin-programs $::env(HOME)/folk-data/local-program $::env(PWD)/user-programs] r]
    fconfigure $fd -buffering line
    while true {
        if {[gets $fd line] < 0} {
            error "fswatch: fswatch failed."
        }
        if {![regexp {builtin-programs\/.*$} $line changedPath]} {
            set changedPath $line
        }

        set changedFilename [file tail $changedPath]
        if {[string index $changedFilename 0] eq "." ||
            [string index $changedFilename 0] eq "#" ||
            [file extension $changedFilename] ne ".folk"} {
            # puts "fswatch: $changedPath updated, ignoring."
            continue
        }

        puts "fswatch: $changedPath updated, reloading."
        set fp [open $changedPath r]; set programCode [read $fp]; close $fp

        Hold! -keep 100ms -on boot.folk -key [list $changedPath code] \
            Claim $changedPath has program code $programCode
    }
} on error err {
    puts stderr "fswatch: Warning: could not invoke `fswatch` ($err)."
    puts stderr "fswatch: Will not watch builtin-programs for changes."
}