/*---------------------------------------------------------------------------
TEMPLATE - ANALYSIS:
--------------------
ReturnType method-name(Traversal<T> tr){
+--------------------+
// invoke the methodAcc: | acc <-- BASE-VALUE |
+--------------------+
method-name-acc(Traversal<T> tr, BASE-VALUE);
}
ReturnType method-name-acc(Traversal<T> tr, ReturnType acc)
... tr.isEmpty() ... -- boolean ::PREDICATE
if true:
... acc -- ReturnType ::BASE-VALUE
if false:
+---------------+
...| tr.getFirst() | ... -- T ::CURRENT
+---------------+
... update(T, ReturnType) -- ReturnType ::UPDATE
+----------------------------+
i.e.: ...| update(tr.getFirst(), acc) | ...
+----------------------------+
+--------------+
... | tr.getRest() | -- Traversal<T> ::ADVANCE
+--------------+
... method-name(tr.getRest(), ReturnType) -- ReturnType
i.e.: ... method-name-acc(tr.getRest(), update(tr.getFirst(), acc))
/----------------------------------------------------------------------------
COMPLETE METHOD TEMPLATE:
-------------------------
<T> ReturnType method-name(Traversal<T> tr){
+----base-value------+
// invoke the methodAcc: | acc <-- BASE-VALUE |
+--------------------+
method-name-acc(Traversal tr, BASE-VALUE);
}
<T> ReturnType method-name(Traversal<T> tr, ReturnType acc){
+---predicate--+
if (| tr.isEmpty() |)
+--------------+
return acc;
else
+----advance---+ +----update-using-current----+
return method-name-acc(| tr.getRest() |, | update(tr.getFirst(), acc) |);
+--------------+ +----------------------------+
}
<T> return-type update(T t, return-type acc){
...
}