public async Task <ExitCode> CourseProgress(string courseId) { var course = await _coursesApi.Course(courseId); var courseUnits = course.Units .Where(u => !u.IsSection) .ToList(); var courseLearners = course.Users .Where(u => u.IsLearner) .ToList(); Empty <IEnumerable <string> >() .Concat(new[] { "name" }.Concat(Enumerable.Select(courseUnits, u => u.Name))) .Concat(GetProgressByUser()) .Transpose() .Then(progress => { _output.Write( header: progress.First(), rows: progress.Skip(1)); }); return(ExitCode.Success); IEnumerable <IEnumerable <string> > GetProgressByUser() { return(courseLearners .Select(LearnerStatus) .Select(_ => _.Result)); } async Task <IEnumerable <string> > LearnerStatus(Course.User learner) { var status = await _coursesApi.UserStatus(learner.Id, course.Id); return(new[] { learner.Name } .Concat(courseUnits.Select(u => StatusForUnit(u, status)))); }