On Wednesday, 21 March 2018 at 12:53:56 UTC, Ali Çehreli wrote:

Here is another one that uses ForwardRange.

import std.range; // empty, take, save, chain, popFrontN;
import std.uni; // asLowerCase;
import std.algorithm; // equal, filter;
import std.conv; // text;

auto initialLowerCased(R)(R str, size_t N = 1) {
    if (str.empty) {
        N = 0;
    }
    auto frontPart = str.take(N);
    auto rest = str.save;
    rest.popFrontN(N);

    return chain(frontPart.asLowerCase, rest);
}

unittest {
assert(initialLowerCased("My Test String", 4).equal("my test String"));
    assert(initialLowerCased("").equal(""));
}

auto foo(R)(R str) {
    return str.filter!(c => c != ' ').initialLowerCased;
}

void main() {
    auto result = foo("My Capital String");
    // result above is a range. std.conv.text can make a string:
    string lower = result.text;
    assert(lower == "myCapitalString");
}

Ali


I like it! I remember having a similar situation another time where it was not about strings. I wonder why there is no method for this in the standard library that can execute a predicate on specific elements of a range..

Reply via email to