Control structures in programming languages: from goto to algebraic effects

Xavier Leroy

Iterators in Java (chapter 4)

import java.util.*;

class SameFringe<T> {
    boolean same_fringe(Iterable<T> s1, Iterable<T> s2) {
        Iterator<T> i1 = s1.iterator();
        Iterator<T> i2 = s2.iterator();
        while (i1.hasNext() && i2.hasNext()) {
            if (! i1.next().equals(i2.next())) return false;
        }
        return ! i1.hasNext() && ! i2.hasNext();
    }
}

class ArrayIterator<T> implements Iterator<T> {
    private T[] arr;
    private int i;
    public boolean hasNext() { return i < arr.length; }
    public T next() { T res = arr[i]; i++; return res; }
    ArrayIterator(T [] arr) { this.arr = arr; this.i = 0; }
}

public class Iterators1 {

    public static void main(String[] argv) {
        String[] a1 = { "a", "c", "d"};
        String[] a2 = { "a", "b", "e"};
        for (int i = 0; i < a1.length; i++) {
            System.out.print(a1[i] + " ");
        }
        System.out.println();
        for (Iterator<String> i = new ArrayIterator<String>(a2);
             i.hasNext(); ) {
            System.out.print(i.next() + " ");
        }
        System.out.println();
        Iterable c1 = Arrays.asList(a1);
        Iterable c2 = Arrays.asList(a2);
        SameFringe<String> sf = new SameFringe<String>();
        System.out.println("same_fringe(c1, c1) " + sf.same_fringe(c1, c1));
        System.out.println("same_fringe(c1, c2) " + sf.same_fringe(c1, c2));
    }
}