split clean() and apply() so clean() can be shared between filters, ensure start < end