March 30, 2011

I take the opportunity of opSlice() now seemingly working (see // thread) to talk about one of the last annoying points for everyday use of ranges for traversal: the absence of "key-ed traversal", or more generally "multi-item traversal", as in:
    foreach (k,v ; myTable) {...}
After some thought on the topic, I would push for a solution where collection types which should provide such multi-item traversal methods, would define a specific struct, eg:

struct Map (K,V) {
    struct Pair { K key ; V value; }
    struct Range {
        @property Pair front () {
            assert (! this.empty);
            Return Pair(...);
    Range opSlice () {
        return Range(this);

The advantages of this solution are:
1. It only uses struct: a builtin, simple & efficient feature.
2. It works *now*, as is; it is just a standard to promote.
3. It trivially allows multiple ranges for the same collection type.
4. It is easy to use & understand on the caller side:

    foreach (pair ; map) {
	doSomethingWith(pair.key, pair.value);

    foreach (record ; table) {
	doSomethingWith(,, record.mail);

vita es estrany