@@ -2447,6 +2447,21 @@ if (isInputRange!RoR && isInputRange!(ElementType!RoR))
24472447 return copy;
24482448 }
24492449 }
2450+
2451+ static if (hasAssignableElements! (ElementType! RoR))
2452+ {
2453+ @property void front(ElementType! (ElementType! RoR) element)
2454+ {
2455+ assert (! empty, " Attempting to assign to front of an empty joiner." );
2456+ _current.front = element;
2457+ }
2458+
2459+ @property void front(ref ElementType! (ElementType! RoR) element)
2460+ {
2461+ assert (! empty, " Attempting to assign to front of an empty joiner." );
2462+ _current.front = element;
2463+ }
2464+ }
24502465 }
24512466 return Result (r);
24522467}
@@ -2606,6 +2621,51 @@ if (isInputRange!RoR && isInputRange!(ElementType!RoR))
26062621 assert (str == " abcd" );
26072622}
26082623
2624+ @safe unittest
2625+ {
2626+ import std.range : repeat;
2627+
2628+ class AssignableRange
2629+ {
2630+ @safe :
2631+ int element;
2632+ @property int front()
2633+ {
2634+ return element;
2635+ }
2636+
2637+ enum empty = false ;
2638+
2639+ void popFront ()
2640+ {
2641+ }
2642+
2643+ @property void front(int newValue)
2644+ {
2645+ element = newValue;
2646+ }
2647+ }
2648+
2649+ static assert (isInputRange! AssignableRange);
2650+ static assert (is (ElementType! AssignableRange == int ));
2651+ static assert (hasAssignableElements! AssignableRange);
2652+ static assert (! hasLvalueElements! AssignableRange);
2653+
2654+ auto range = new AssignableRange();
2655+ assert (range.element == 0 );
2656+
2657+ auto joined = joiner(repeat(range));
2658+ joined.front = 5 ;
2659+ assert (range.element == 5 );
2660+ assert (joined.front == 5 );
2661+
2662+ joined.popFront;
2663+ int byRef = 7 ;
2664+ joined.front = byRef;
2665+ assert (range.element == byRef);
2666+ assert (joined.front == byRef);
2667+ }
2668+
26092669/+ +
26102670Implements the homonym function (also known as $(D accumulate), $(D
26112671compress), $(D inject), or $(D foldl)) present in various programming
0 commit comments