combinator and chooser refatored;