The input (that feeds a function) can be implemented in 2 ways: controlled by the caller or by the callee.
The outputs (that is provided by a function) can be implemented in 2 ways: exposed to the caller or by message.
The function's caller controls the input.