refactored to combinators package