/*-***********************************************************************
TEMPLATE-ANALYSIS:
return-type method-name(ArrayList<T> alist){
  int index; // to represent the traversal
  return-type acc = BASE-VALUE;
  for (index = 0;  // start the traversal at the beginning
       CONTINUATION-PREDICATE;
       index  = ADVANCE){
    acc = UPDATE (CURREENT, acc);
  }
  return acc;
}

COMPLETE METHOD TEMPLATE:
-------------------------
<T> return-type method-name(ArrayList<T> alist){
  +------------------------------+
  | return-type acc = BASE-VALUE |;
  +------------------------------+

  for (index = 0;
       +----------------------+
       | index < alist.size() |;
       +----------------------+
               +-----------+
       index = | index + 1 |)
               +-----------+
  {
           +-------------------------------+  
     acc = | update(alist.get(index), acc) |;
           +-------------------------------+  
  }
  return acc;
}

<T> return-type update(T t, return-type acc){
...
}

/** IMPERATIVE VERSION THAT USES for LOOP WITH index based traversal.
 * Count how many data elements generated by the given traversal
 * satisfy the given ISelect predicate.
 */  
public <T> boolean orMapForCounted(ArrayList<T> alist, 
                                   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 ... 
  //     ...BUT initalize the loop index: int index = 0; 
  // continuation-predicate: index < alist.size() 
  // update: index = index + 1
  for(int index = 0; index < alist.size(); index = index + 1){
    
    // loop body: uses current element
    acc = updateOrMap(alist.get(index), acc, choice);
  }
  
  // postmortem: produce the result
  return acc;
}