Split but keep one delimiter
Taylor Hillegeist
taylorh140 at gmail.com
Fri Dec 6 03:37:24 UTC 2019
Learning all the ins and outs of the std library is fun. But
there are soo many hidden gems that its hard to tell when to keep
looking and when to just write something. I was working on a
split function with some particulars:
Split but keep exactly one delimiter at the beginning of each
section
so if splitting on B:
AAAABADSFBBBBDER ==> AAAA BADSF BDER
BBBBURPBURGER ==> BURP BURGER
BBBABBLEB ==> BA BLE B
Below is my attempt (As far as I know it works)
'''D
import std;
auto splitB(T)(T irange, T isplitter)
if (isInputRange!T){
struct SplitB(T) {
private T _str;
private T _splitter;
private size_t cnt;
this(T instr,T splitter){
_str=instr;
_splitter=splitter;
}
bool empty() const{
return _str.length==0;
}
ref auto front(){
auto tmp = _str.until!"a!=b"(_splitter);
auto tmp2 =
_str.drop(tmp.count).until(_splitter,Yes.openRight);
cnt = tmp.count + tmp2.count;
return chain(tmp.takeOne,tmp2);
}
void popFront(){
_str = _str.drop(cnt);
}
}
return SplitB!T( irange,isplitter);
}
void main()
{
"BBAAABSDFSDFBBBAFFA".splitB("A").writeln;
}
'''
I guess there are two reasons for this post.
1. There are probably much easier ways to do this, I would like
to hear about that.
2. This is one of my first complete range setups. Any coding tips
/ critical comments would be helpful.
More information about the Digitalmars-d-learn
mailing list