public static class MyPipeline
{
	public static IEnumerable<int> Step1(this IEnumerable<int> data)
	{
		//There is no point in verifying if data exists at the cost of having to access the entire data set
    
    //We can make sure that we use null coalescent operators in the entire pipeline, or other better practices. Of course
    //this is always a design choice that should be evaluated for each context and bussiness requirements.
    
		return data;
	}
	public static IEnumerable<int> Step2(this IEnumerable<int> data, int filterBottomThreshold)
	{
		return data?.Where(t => t > filterBottomThreshold); //forces query evaluation
	}
	public static IEnumerable<int> Step3(this IEnumerable<int> data, int filterTopThreshold)
	{
		return data?.Where(t => t < filterTopThreshold); //forces query evaluation
	}

	public static IEnumerable<int> Step4(this IEnumerable<int> data, int page)
	{
		var pageSize = 1000;
		return data?.Skip(pageSize * page).Take(pageSize);
	}
}