On Wednesday, 24 September 2014 at 17:15:39 UTC, Ali Çehreli wrote:
find() and friends can be used:

import std.algorithm;

void main()
{
    string path = "myFile.doc";
    string extension = ".doc";

    path = findSplitBefore(path, extension)[0];
    assert(path == "myFile");
}

I had thought of that, but then you might get in trouble with something like:
string path = "myPath.doc.old"

And three retro()s make one modern(): :p

import std.algorithm;
import std.range;

void main()
{
    string path = "myFile.doc";
    string extension = ".doc";

    path = findSplitAfter(path.retro,
                          extension.retro)
           [1].retro;

    assert(path == "myFile");
}

Ali

That was the next one I had. Except here:
- You still run into issues if the extension is *not* .doc (and there happens to be a .doc somewhere in there). - You are paying for a search, when you are only interested in testing a prefix.

I had thought of this though:
void main()
{
    string path = "myFile.doc";
    string extension = ".doc";

    auto rpath = path.retro();
    skipOver(rpath, extension.retro);
    path = rpath.retro();
    assert(path == "myFile");
}

The "issue" though is that skipOver modifies an rvalue, so it's not as "functional-style" as I would have liked it.

Anyways, the conclusion here (IMO), is that to manipulate paths, use std.path.

Reply via email to