Data Pipeline Patterns
Pipeline Stages
Named intermediate lists make a pipeline easier to inspect and test.
Program
Play the program to select tasks and then transform their titles.
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(",")}');
}
showDone ← false
6];7var showDone = false;8var selected = <Map<String, Object>>[];values this stepfalseshowDoneselected ← []
7var showDone = false;8var selected = <Map<String, Object>>[];9for (var task in tasks) {values this step[]selectedtask ← docs/done
8var selected = <Map<String, Object>>[];9for (var task in tasks) {10 if (showDone || task['done'] == false) selected.add(task);values this stepdocs/donetaskselected ← []
9for (var task in tasks) {10 if (showDone || task['done'] == false) selected.add(task);11}values this step[]selectedfalseshowDonetruetask.donetask ← tests/open
8var selected = <Map<String, Object>>[];9for (var task in tasks) {10 if (showDone || task['done'] == false) selected.add(task);values this steptests/opentaskselected ← [tests]
9for (var task in tasks) {10 if (showDone || task['done'] == false) selected.add(task);11}values this step[tests]selectedtask ← deploy/open
8var selected = <Map<String, Object>>[];9for (var task in tasks) {10 if (showDone || task['done'] == false) selected.add(task);values this stepdeploy/opentaskselected ← [tests, deploy]
9for (var task in tasks) {10 if (showDone || task['done'] == false) selected.add(task);11}values this step[tests, deploy]selectedtitles ← [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]selectedprint('tasks=${titles.join(",")}');
12 var titles = selected.map((task) => (task['title'] as String).toUpperCase()).toList();13 print('tasks=${titles.join(",")}');14}outputtasks=TESTS,DEPLOYvalues this step[TESTS, DEPLOY]titles
showDone ← true
6];7var showDone = true;8var selected = <Map<String, Object>>[];values this steptrueshowDoneselected ← []
7var showDone = true;8var selected = <Map<String, Object>>[];9for (var task in tasks) {values this step[]selectedtask ← docs/done
8var selected = <Map<String, Object>>[];9for (var task in tasks) {10 if (showDone || task['done'] == false) selected.add(task);values this stepdocs/donetaskselected ← [docs]
9for (var task in tasks) {10 if (showDone || task['done'] == false) selected.add(task);11}values this step[docs]selectedtrueshowDonetask ← tests/open
8var selected = <Map<String, Object>>[];9for (var task in tasks) {10 if (showDone || task['done'] == false) selected.add(task);values this steptests/opentaskselected ← [docs, tests]
9for (var task in tasks) {10 if (showDone || task['done'] == false) selected.add(task);11}values this step[docs, tests]selectedtrueshowDonetask ← deploy/open
8var selected = <Map<String, Object>>[];9for (var task in tasks) {10 if (showDone || task['done'] == false) selected.add(task);values this stepdeploy/opentaskselected ← [docs, tests, deploy]
9for (var task in tasks) {10 if (showDone || task['done'] == false) selected.add(task);11}values this step[docs, tests, deploy]selectedtrueshowDonetitles ← [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]selectedprint('tasks=${titles.join(",")}');
12 var titles = selected.map((task) => (task['title'] as String).toUpperCase()).toList();13 print('tasks=${titles.join(",")}');14}outputtasks=DOCS,TESTS,DEPLOYvalues 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.