The way you configure your terminal behavior; a trivial wrapper around a
function, though you should provide a good
.toString method to make
debugging easier. The [[TermInfo]] and [[TermAction]] types are its
interface to the terminal.
[[Filter]]s are composed sequentially: if a filter returns
None the next
filter is tried, while if a filter returns
Some that ends the cascade.
op function interacts with the terminal purely through
immutable case classes, the Filter itself is free to maintain its own state
and mutate it whenever, even when returning
None to continue the cascade.
.toString of this object, except by making it separate we force
the implementer to provide something and stop them from accidentally
leaving it as the meaningless default.