A long time ago, in the League\Pipeline repository, there was an issue that asked about changing the interfaces to separate the concerns, and also allow the pipelines to be immutable. I thought this was a great idea at the time, and so I wrote SyberIsle\Pipeline. Three years later I still think the idea has merit, but I never mentioned it in the readme, and I forgot why I wrote this implementation.
So this is more here for posterity, and to help my brain remember why. I’m still using the SyberIsle\Pipeline implementation, and have just recently updated it’s dependencies.