// returns (live value, updater) static Pair, Runnable> trimmedFileLiveValue(final File f, fS defaultValue) { final SimpleLiveValue lv = stringLiveValue(trim(loadTextFile(f, defaultValue))); lv.onChange(r { saveTextFileIfDifferent(f, lv!) }); ret pair(lv, (Runnable) r { lv.set(trim(loadTextFile(f, defaultValue))) }); }