// raise flag to stop static Flag tailFile(final File file, final int interval, fO onData) { final new Flag flag; thread "Tail File" { long l = 0; repeat with ms sleep interval { pcall { long l2 = l(file); if (l2 < l) l = 0; if (l2 != l) pcall { S text = null; pcall { text = loadTextFilePart(file, l, l2); } if (nempty(text)) callF(onData, text); l = l2; } } if (flag.isUp()) break; // break AFTER we checked for new data } } ret flag; }