This module will let you perform some inlining on Yhc.Core code. The InlineMode argument
lets you select what algorithm is used. All should be terminating, and none should
increase the number of function calls in a program.

For comparison, GHC's inlining mode is more powerful than InlineForward, but less
powerful than InlineFull. (And just so people understand, powerful does not mean more
performance, it means more inlining - the two are not always the same!)

A function is a forwarder if all it does is call another function,
using only the given arguments, possibly reordered but not duplicated.
A forwarder can also be a single constant value, or a simple argument
value (a projection), or a constructor with no arguments. i.e.

This does the most inlining it can, but never inlines the same function
more than once in a given expression - to ensure termination. Also doesn't
inline CAF's, since that would go wrong. Large functions, recursive functions,
duplicated arguments etc - all are inlined without question.

Duplicated arguments are moved into a let, to ensure they are not computed
additional times.

This mode is more than likely to increase the code size in most programs.