/*-***********************************************************************
TEMPLATE-ANALYSIS:
return-type method-name(Traversal tr){
return-type acc = BASE-VALUE;
for (return-type acc = BASE-VALUE; *** DO NOT INCLUDE - DONE ALREADY ***
CONTINUATION-PREDICATE;
tr = ADVANCE){
acc = UPDATE (CURREENT, acc);
}
return acc;
}
COMPLETE METHOD TEMPLATE:
-------------------------
<T> return-type method-name(Traversal<T> tr){
+------------------------------+
| return-type acc = BASE-VALUE |;
+------------------------------+
for (... no initialization is needed ...;
+---------------+
| !tr.isEmpty() |;
+---------------+
+--------------+
tr = | tr.getRest() |)
+--------------+
{
+----------------------------+
acc = | update(tr.getFirst(), acc) |;
+----------------------------+
}
return acc;
}
<T> return-type update(T t, return-type acc){
...
}
*********************************************************************-*/
/** IMPERATIVE VERSION THAT USES for LOOP WITH THE Traversal.
* Count how many data elements generated by the given traversal
* satisfy the given ISelect predicate.
*/
// orMap with for loop and iterator
public <T> boolean orMapFor(Traversal<T> tr, ISelect<T> choice){
// Define the accumulator and initialize it to the BASE-VALUE;
boolean acc = false;
// loop header:
// for(... accumulator is already defined and initialized ... ;
// continuation-predicate;
// update)
for(;
!tr.isEmpty();
tr = tr.getRest()){
// loop body: uses current element
acc = updateOrMap(tr.getFirst(), acc, choice);
}
// postmortem: produce the result
return acc;
}