sclass OnePath { new ByteBuffer steps; static final Pt[] directions = { pt(0, 0), pt(-1, -1), pt(0, -1), pt(1, -1), pt(1, 0), pt(1, 1), pt(0, 1), pt(-1, 1), pt(-1, 0) }; int size aka length() { ret steps.size(); } toString { ret singleDigitBytesToString(steps); } // includes first point, so returns length()+1 points in total ItIt pointIterator(Pt startPt default origin()) { ret new ItIt { int i = 0, n = length(); Pt p = startPt; public bool hasNext() { ret i <= n; } public Pt next() { ret p; if (i < n) p = translatePt(p, getStepAsPt(i)); ++i; } }; } Pt getStepAsPt(int i) { ret directions[steps.get(i)]; } }