Named intermediate lists make a pipeline easier to inspect and test.

Program

Play the program to select tasks and then transform their titles.

showDone
pipeline_stages.dart
Replay: real traced execution (multi-file project)
void main() {
  var tasks = [
    {'title': 'docs', 'done': true},
    {'title': 'tests', 'done': false},
    {'title': 'deploy', 'done': false},
  ];
  var showDone = false;
  var selected = <Map<String, Object>>[];
  for (var task in tasks) {
    if (showDone || task['done'] == false) selected.add(task);
  }
  var titles = selected.map((task) => (task['title'] as String).toUpperCase()).toList();
  print('tasks=${titles.join(",")}');
}
void main() {
  var tasks = [
    {'title': 'docs', 'done': true},
    {'title': 'tests', 'done': false},
    {'title': 'deploy', 'done': false},
  ];
  var showDone = true;
  var selected = <Map<String, Object>>[];
  for (var task in tasks) {
    if (showDone || task['done'] == false) selected.add(task);
  }
  var titles = selected.map((task) => (task['title'] as String).toUpperCase()).toList();
  print('tasks=${titles.join(",")}');
}
  1. showDone ← false

    6];7var showDone = false;8var selected = <Map<String, Object>>[];
    values this stepfalseshowDone
  2. selected ← []

    7var showDone = false;8var selected = <Map<String, Object>>[];9for (var task in tasks) {
    values this step[]selected
  3. task ← docs/done

    8var selected = <Map<String, Object>>[];9for (var task in tasks) {10  if (showDone || task['done'] == false) selected.add(task);
    values this stepdocs/donetask
  4. selected ← []

    9for (var task in tasks) {10  if (showDone || task['done'] == false) selected.add(task);11}
    values this step[]selectedfalseshowDonetruetask.done
  5. task ← tests/open

    8var selected = <Map<String, Object>>[];9for (var task in tasks) {10  if (showDone || task['done'] == false) selected.add(task);
    values this steptests/opentask
  6. selected ← [tests]

    9for (var task in tasks) {10  if (showDone || task['done'] == false) selected.add(task);11}
    values this step[tests]selected
  7. task ← deploy/open

    8var selected = <Map<String, Object>>[];9for (var task in tasks) {10  if (showDone || task['done'] == false) selected.add(task);
    values this stepdeploy/opentask
  8. selected ← [tests, deploy]

    9for (var task in tasks) {10  if (showDone || task['done'] == false) selected.add(task);11}
    values this step[tests, deploy]selected
  9. titles ← [TESTS, DEPLOY]

    11}12var titles = selected.map((task) => (task['title'] as String).toUpperCase()).toList();13print('tasks=${titles.join(",")}');
    values this step[TESTS, DEPLOY]titles[tests, deploy]selected
  10. print('tasks=${titles.join(",")}');

    12  var titles = selected.map((task) => (task['title'] as String).toUpperCase()).toList();13  print('tasks=${titles.join(",")}');14}
    outputtasks=TESTS,DEPLOY
    values this step[TESTS, DEPLOY]titles
  1. showDone ← true

    6];7var showDone = true;8var selected = <Map<String, Object>>[];
    values this steptrueshowDone
  2. selected ← []

    7var showDone = true;8var selected = <Map<String, Object>>[];9for (var task in tasks) {
    values this step[]selected
  3. task ← docs/done

    8var selected = <Map<String, Object>>[];9for (var task in tasks) {10  if (showDone || task['done'] == false) selected.add(task);
    values this stepdocs/donetask
  4. selected ← [docs]

    9for (var task in tasks) {10  if (showDone || task['done'] == false) selected.add(task);11}
    values this step[docs]selectedtrueshowDone
  5. task ← tests/open

    8var selected = <Map<String, Object>>[];9for (var task in tasks) {10  if (showDone || task['done'] == false) selected.add(task);
    values this steptests/opentask
  6. selected ← [docs, tests]

    9for (var task in tasks) {10  if (showDone || task['done'] == false) selected.add(task);11}
    values this step[docs, tests]selectedtrueshowDone
  7. task ← deploy/open

    8var selected = <Map<String, Object>>[];9for (var task in tasks) {10  if (showDone || task['done'] == false) selected.add(task);
    values this stepdeploy/opentask
  8. selected ← [docs, tests, deploy]

    9for (var task in tasks) {10  if (showDone || task['done'] == false) selected.add(task);11}
    values this step[docs, tests, deploy]selectedtrueshowDone
  9. titles ← [DOCS, TESTS, DEPLOY]

    11}12var titles = selected.map((task) => (task['title'] as String).toUpperCase()).toList();13print('tasks=${titles.join(",")}');
    values this step[DOCS, TESTS, DEPLOY]titles[docs, tests, deploy]selected
  10. print('tasks=${titles.join(",")}');

    12  var titles = selected.map((task) => (task['title'] as String).toUpperCase()).toList();13  print('tasks=${titles.join(",")}');14}
    outputtasks=DOCS,TESTS,DEPLOY
    values this step[DOCS, TESTS, DEPLOY]titles
stage names `selected` and `titles` make intermediate data visible.
map `selected.map(...)` transforms each selected task.
toUpperCase String methods can be part of the transform stage.