Output range of ranges to single buffer

Jacob Carlborg via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Jan 14 11:50:03 PST 2016


On 2016-01-14 17:59, Ali Çehreli wrote:

> Here is an experiment that wraps the third party type to provide a lazy
> toString:
>
> import std.stdio;
> import std.format;
> import std.array;
> import std.algorithm;
> import std.range;
>
> /* Wraps an element and provides a lazy toString that dispatches the
> work to a
>   * user-provided 'formatter' function. E is the element type. */
> struct Formatted(alias formatter, E) {
>      E element;
>
>      void toString(void delegate(const(char)[]) sink) const {
>          formatter(sink, element);
>      }
> }

Wrap the object, why didn't I think of that :)

> /* Adapts a range by converting the elements to 'Formatted'. R is the range
>   * type. */
> auto formatted(alias formatter, R)(R range) {
>      return range.map!(e => Formatted!(formatter, ElementType!R)(e));
> }
>
> /* A third party test type that does not have a lazy toString member
>   * function. */
> struct Foo {
>      double d;
>      string s;
> }
>
> void main() {
>      auto data = [ Foo(1.5, "hello"), Foo(2.5, "world") ];
>
>      auto buf = appender!string();
>      formattedWrite(buf, "%(%s\n%)",
>                     data.formatted!(
>                         (sink, a) => formattedWrite(sink, "%s and %s",
>                                                     a.d, a.s)));
>
>      writeln(buf.data);
> }
>
> Prints the objects according to the user's lambda:
>
> 1.5 and hello
> 2.5 and world

Thanks.

-- 
/Jacob Carlborg


More information about the Digitalmars-d-learn mailing list