Skip to content

Instantly share code, notes, and snippets.

@Zshazz

Zshazz/merger.d Secret

Created February 27, 2013 01:42
Show Gist options
  • Save Zshazz/c488e70eee4fd352b789 to your computer and use it in GitHub Desktop.
Save Zshazz/c488e70eee4fd352b789 to your computer and use it in GitHub Desktop.
import std.stdio, std.file, std.algorithm, std.conv;
void main() {
dirEntries("data", "*.out", SpanMode.shallow)
.map!(e => File(e.name).byLine(KeepTerminator.yes)
// Option 1:
//.map!(l => l.to!string())()
//.array()
// -- OR --
// Option 2:
//.map!(l => l.to!string())()
//.wrap()
// -- OR --
// Option 3:
//.refMap!(l => l.to!string())()
// -- OR --
// My current solution:
.map!(l => l.to!string())()
.cached()
)()
.array()
.nWayUnion()
.copy(stdout.lockingTextWriter);
}
import std.range;
auto wrap(R)(R range) {
return new Wrap!R(range);
}
class Wrap(R) {
alias E = ElementType!R;
R _range;
this(R r) {
_range = r;
}
@property E front() { return _range.front; }
@property bool empty() { return _range.empty; }
void popFront() { _range.popFront; }
}
auto refMap(alias f, R)(R range) {
return new RefMapResult!(f,R)(range);
}
class RefMapResult(alias f, R) {
alias E = typeof(f(ElementType!R.init));
R _range;
E _front;
this(R r) {
_range = r;
if(!_range.empty)
_front = f(_range.front);
}
@property E front() {
return _front;
}
@property bool empty() {
return _range.empty;
}
void popFront() {
_range.popFront();
if(!_range.empty)
_front = f(_range.front);
}
}
auto cached(R)(R range) {
return new CacheWrap!R(range);
}
class CacheWrap(R) {
alias E = ElementType!R;
R _range;
E _front;
this(R r) {
_range = r;
if(!_range.empty)
_front = _range.front;
}
@property E front() { return _front; }
@property bool empty() { return _range.empty; }
void popFront() {
_range.popFront;
if(!_range.empty)
_front = _range.front;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment