Make a TreeMaker that will result in an extractor call specified by
the next TreeMaker (here, we don't know which it'll be) is chained after this one by flatMap'ing
a function with binder
nextBinder over our extractor's result
the function's body is determined by the next TreeMaker
(furthermore, the interpretation of
flatMap depends on the codegen instance we're using).
An optimized version of ExtractorTreeMaker for Products.
implements the run-time aspects of (§8.
a flow-sensitive, generalised, common sub-expression elimination reuse knowledge from performed tests the only sub-expressions we consider are the conditions and results of the three tests (type, type&equality, equality) when a sub-expression is shared, it is stored in a mutable variable the variable is floated up so that its scope includes all of the program that shares it we generalize sharing to implication, where b reuses a if a => b and priors(a) => priors(b) (the priors of a sub expression form the path through the decision tree)