Now there is a consistent interface where we wrap vectors in results, with a vector of errors if any.
This means that each pipeline stage can internally determine if it lets elements of a vector interact, i.e., in the type checking stage types are distributed amongst several AST Trees, whereas in the parsing stage, tokens are processed as-is, without interaction between different token streams.
Relevant issues
The pipeline was cluttered
Summary
Now there is a consistent interface where we wrap vectors in results, with a vector of errors if any. This means that each pipeline stage can internally determine if it lets elements of a vector interact, i.e., in the type checking stage types are distributed amongst several AST Trees, whereas in the parsing stage, tokens are processed as-is, without interaction between different token streams.