/*-**********************************************************************
TEMPLATE-ANALYSIS:
return-type method-name(Traversal tr){
return-type acc = BASE-VALUE;
while (CONTINUATION-PREDICATE){
acc = UPDATE (CURREENT, acc);
tr = ADVANCE;
}
return acc;
}
COMPLETE METHOD TEMPLATE:
-------------------------
<T> return-type method-name(Traversal<T> tr){
+------------------------------+
| return-type acc = BASE-VALUE |;
+------------------------------+
+---------------+
while (| !tr.isEmpty() |)
+---------------+
{
+----------------------------+
acc = | update(tr.getFirst(), acc) |;
+----------------------------+
+--------------+
tr = | tr.getRest() |;
+--------------+
}
return acc;
}
<T> return-type update(T t, return-type acc){
...
}
*********************************************************************-*/
/** VERSION THAT USES THE while LOOP.
* Count how many data elements generated by the given traversal
* satisfy the given ISelect predicate.
*/
// orMap with while loop and iterator
public <T> boolean orMapWhile(Traversal<T> tr,
ISelect<T> choice){
// preamble: Define accumulator, initialize it to the BASE-VALUE
boolean acc = false;
// loop header: while(continuation-predicate)
while(!tr.isEmpty()){
// loop body: update
acc = updateOrMap(tr.getFirst(), acc, choice);
// loop advance:
tr = tr.getRest();
}
// postmortem: produce the result
return acc;
}