View mode: basic / threaded / horizontal-split · Log in · Help
February 27, 2013
[Issue 9611] New: std.algorithm.nWayUnion(Tuple) too?
http://d.puremagic.com/issues/show_bug.cgi?id=9611

          Summary: std.algorithm.nWayUnion(Tuple) too?
          Product: D
          Version: D2
         Platform: All
       OS/Version: All
           Status: NEW
         Severity: enhancement
         Priority: P2
        Component: Phobos
       AssignedTo: nobody@puremagic.com
       ReportedBy: bearophile_hugs@eml.cc


--- Comment #0 from bearophile_hugs@eml.cc 2013-02-27 15:12:43 PST ---
In some cases I have had to merge ranges of different type. So maybe for such
situations it's worth supporting nWayUnion of a Tuple of ranges:


import std.algorithm: nWayUnion, map;
import std.range: iota;
import std.typecons: tuple;
void main() {
   auto a = iota(10);
   auto b = [3, 6, 9];
   auto c = iota(11).map!q{a * a};
   auto r = nWayUnion(tuple(a, b, c));
}


Note: in all such of my usage cases the number of the ranges was limited, 2 or
3. So when the input of nWayUnion is a tuple I think there is no need for
nWayUnion to keep the ranges inside with a BinaryHeap.

- - - - - - - - - - - - - -

Current workaround, suggested by Ali Çehreli:

import std.algorithm: nWayUnion, map;
import std.range: iota, InputRange, inputRangeObject;
void main() {
   InputRange!int a = inputRangeObject(iota(10));
   InputRange!int b = inputRangeObject([3, 6, 9]);
   InputRange!int c = inputRangeObject(iota(11).map!q{a * a});
   auto r = nWayUnion([a, b, c]);
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
February 28, 2013
[Issue 9611] std.algorithm.nWayUnion(Tuple) too?
http://d.puremagic.com/issues/show_bug.cgi?id=9611


Chris Cain <zshazz@gmail.com> changed:

          What    |Removed                     |Added
----------------------------------------------------------------------------
                CC|                            |zshazz@gmail.com


--- Comment #1 from Chris Cain <zshazz@gmail.com> 2013-02-27 17:13:37 PST ---
(In reply to comment #0)
> Current workaround, suggested by Ali Çehreli:
> 
> import std.algorithm: nWayUnion, map;
> import std.range: iota, InputRange, inputRangeObject;
> void main() {
>     InputRange!int a = inputRangeObject(iota(10));
>     InputRange!int b = inputRangeObject([3, 6, 9]);
>     InputRange!int c = inputRangeObject(iota(11).map!q{a * a});
>     auto r = nWayUnion([a, b, c]);
> }

A function that does the conversion to InputRange!E could easily be created and
added to Phobos to handle this type of situation. Ranges such as nWayUnion
could call this (currently poorly named) tupWrapper when isTuple!T returns
true.

---

import std.stdio, std.range, std.typecons, std.algorithm;

void main() {
   auto tup = tuple(iota(5), repeat(1).take(3), [5,9,30]);

   foreach(e; tupWrapper(tup).nWayUnion())
       writeln(e);
}

auto tupWrapper(Tup)(Tup tup) {
   alias E = ElementType!(Tup.Types[0]);
   InputRange!E[] arr;
   foreach(T; Tup.Types)
       static assert(is(ElementType!T == E));

   foreach(ref e; tup)
       arr ~= inputRangeObject(e);

   return arr;
}

---

Currently, that solution isn't too robust. Ideally it would figure out the most
powerful range type (either InputRange, ForwardRange, ..., RandomAccessRange)
that all the types in the Tuple.Types support and it would return that.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
February 28, 2013
[Issue 9611] std.algorithm.nWayUnion(Tuple) too?
http://d.puremagic.com/issues/show_bug.cgi?id=9611



--- Comment #2 from bearophile_hugs@eml.cc 2013-02-27 17:24:55 PST ---
(In reply to comment #1)

> A function that does the conversion to InputRange!E could easily be created and
> added to Phobos to handle this type of situation.

I think InputRange and inputRangeObject are not needed to solve this. A "static
foreach" on the Tuple fields (that contain ranges) looking for the smallest
value seems enough to me.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
February 28, 2013
[Issue 9611] std.algorithm.nWayUnion(Tuple) too?
http://d.puremagic.com/issues/show_bug.cgi?id=9611


Andrei Alexandrescu <andrei@erdani.com> changed:

          What    |Removed                     |Added
----------------------------------------------------------------------------
            Status|NEW                         |ASSIGNED
                CC|                            |andrei@erdani.com
        AssignedTo|nobody@puremagic.com        |andrei@erdani.com


--- Comment #3 from Andrei Alexandrescu <andrei@erdani.com> 2013-02-27 17:43:45 PST ---
Yah, this should be added. Suffice to add a one-argument member function to
SortedRange.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Top | Discussion index | About this forum | D home