www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Rust-like collect in D

reply =?UTF-8?B?Tm9yZGzDtnc=?= <per.nordlow gmail.com> writes:
Is there a concept in D similar to Rust's `collect`:

https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect

If not, I'm eager to implement it to support D-style containers.

What would the desired interface look like?

Perhaps:

     0.iota(n).collect!Array

Or can/should we just overload `std.conv.to` as

     0.iota(n).to!Array

eventhough the element type is not explicit in the expression 
`to.!Array`?
Oct 06 2016
next sibling parent reply rikki cattermole <rikki cattermole.co.nz> writes:
On 07/10/2016 3:32 AM, Nordlöw wrote:
 Is there a concept in D similar to Rust's `collect`:

 https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect

 If not, I'm eager to implement it to support D-style containers.

 What would the desired interface look like?

 Perhaps:

     0.iota(n).collect!Array

 Or can/should we just overload `std.conv.to` as

     0.iota(n).to!Array

 eventhough the element type is not explicit in the expression `to.!Array`?
So an input range to array? Sure std.array : array.
Oct 06 2016
parent reply =?UTF-8?B?Tm9yZGzDtnc=?= <per.nordlow gmail.com> writes:
On Thursday, 6 October 2016 at 14:33:59 UTC, rikki cattermole 
wrote:
 So an input range to array?
 Sure std.array : array.
No, we want a generic alternative that fills any kind of container, typically non-GC allocated.
Oct 06 2016
parent cym13 <cpicard openmailbox.org> writes:
On Thursday, 6 October 2016 at 14:58:34 UTC, Nordlöw wrote:
 On Thursday, 6 October 2016 at 14:33:59 UTC, rikki cattermole 
 wrote:
 So an input range to array?
 Sure std.array : array.
No, we want a generic alternative that fills any kind of container, typically non-GC allocated.
Sounds like what output ranges are here for.
Oct 06 2016
prev sibling next sibling parent reply Dicebot <public dicebot.lv> writes:
On Thursday, 6 October 2016 at 14:32:44 UTC, Nordlöw wrote:
 Is there a concept in D similar to Rust's `collect`:

 https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect

 If not, I'm eager to implement it to support D-style containers.

 What would the desired interface look like?

 Perhaps:

     0.iota(n).collect!Array

 Or can/should we just overload `std.conv.to` as

     0.iota(n).to!Array

 eventhough the element type is not explicit in the expression 
 `to.!Array`?
If an entity (i.e. container) implements OutputRange API, you can already do it: 0.iota(n).copy(container);
Oct 06 2016
next sibling parent =?UTF-8?B?Tm9yZGzDtnc=?= <per.nordlow gmail.com> writes:
On Thursday, 6 October 2016 at 16:14:33 UTC, Dicebot wrote:
 If an entity (i.e. container) implements OutputRange API, you 
 can already do it:

 0.iota(n).copy(container);
Thanks, that's what I was looking for.
Oct 06 2016
prev sibling parent reply =?UTF-8?B?Tm9yZGzDtnc=?= <per.nordlow gmail.com> writes:
On Thursday, 6 October 2016 at 16:14:33 UTC, Dicebot wrote:
 If an entity (i.e. container) implements OutputRange API, you 
 can already do it:

 0.iota(n).copy(container);
Ahh, not quite what I wanted... I want to mimic the functional style Rust provides, where the `container` is constructed inline and does not have to be declared separately. Is there a way to do this, or do we need something similar to `collect` in Phobos? Something like import std.container.array : Array; 0.iota(n).collect!Array
Oct 06 2016
next sibling parent Jonathan M Davis via Digitalmars-d-learn writes:
On Thursday, October 06, 2016 16:56:26 Nordlöw via Digitalmars-d-learn wrote:
 On Thursday, 6 October 2016 at 16:14:33 UTC, Dicebot wrote:
 If an entity (i.e. container) implements OutputRange API, you
 can already do it:

 0.iota(n).copy(container);
Ahh, not quite what I wanted... I want to mimic the functional style Rust provides, where the `container` is constructed inline and does not have to be declared separately. Is there a way to do this, or do we need something similar to `collect` in Phobos? Something like import std.container.array : Array; 0.iota(n).collect!Array
That makes it sound like you just need the container to have a constructor that takes a range - either that or a helper function which constructs the container from a range (e.g. std.container.rbTree.redBlackTree is a helper function for constructing a RedBlackTree from a range). - Jonathan M Davis
Oct 06 2016
prev sibling parent reply Dicebot <public dicebot.lv> writes:
On Thursday, 6 October 2016 at 16:56:26 UTC, Nordlöw wrote:
 Is there a way to do this, or do we need something similar to 
 `collect` in Phobos? Something like

 import std.container.array : Array;

 0.iota(n).collect!Array
You mean semantics like this? Container collect(Container, Range) (Range r) if(isOutputRange!Container) { Container container; r.copy(container); return container; }
Oct 06 2016
parent =?UTF-8?B?Tm9yZGzDtnc=?= <per.nordlow gmail.com> writes:
On Thursday, 6 October 2016 at 17:22:10 UTC, Dicebot wrote:
 On Thursday, 6 October 2016 at 16:56:26 UTC, Nordlöw wrote:
 Is there a way to do this, or do we need something similar to 
 `collect` in Phobos? Something like

 import std.container.array : Array;

 0.iota(n).collect!Array
You mean semantics like this? Container collect(Container, Range) (Range r) if(isOutputRange!Container) { Container container; r.copy(container); return container; }
Yes, along with inference of element type of the container.
Oct 06 2016
prev sibling next sibling parent reply ag0aep6g <anonymous example.com> writes:
On 10/06/2016 04:32 PM, Nordlöw wrote:
 Is there a concept in D similar to Rust's `collect`:

 https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect

 If not, I'm eager to implement it to support D-style containers.

 What would the desired interface look like?

 Perhaps:

     0.iota(n).collect!Array

 Or can/should we just overload `std.conv.to` as

     0.iota(n).to!Array

 eventhough the element type is not explicit in the expression `to.!Array`?
https://dlang.org/phobos/std_container_util.html#.make ---- import std.container.array: Array; import std.container.util: make; import std.range: iota; void main() { auto arr = 0.iota(99).make!Array; } ----
Oct 06 2016
parent ag0aep6g <anonymous example.com> writes:
On 10/06/2016 07:44 PM, ag0aep6g wrote:
 https://dlang.org/phobos/std_container_util.html#.make
More specifically, the second overload is where it's at: https://dlang.org/phobos/std_container_util.html#.make.2
Oct 06 2016
prev sibling parent reply Andrei Alexandrescu <SeeWebsiteForEmail erdani.org> writes:
On 10/06/2016 10:32 AM, Nordlöw wrote:
 Is there a concept in D similar to Rust's `collect`:

 https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect
That's "make" in std.container. Is that what you're looking for? As an aside, "collect" is an awful abbreviation of "collection". -- Andrei
Oct 12 2016
next sibling parent reply Meta <jared771 gmail.com> writes:
On Thursday, 13 October 2016 at 01:15:22 UTC, Andrei Alexandrescu 
wrote:
 On 10/06/2016 10:32 AM, Nordlöw wrote:
 Is there a concept in D similar to Rust's `collect`:

 https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect
That's "make" in std.container. Is that what you're looking for? As an aside, "collect" is an awful abbreviation of "collection". -- Andrei
I've always thought of it more as "collect the elements of the iterator into a container".
Oct 12 2016
parent reply Russel Winder via Digitalmars-d-learn <digitalmars-d-learn puremagic.com> writes:
On Thu, 2016-10-13 at 02:33 +0000, Meta via Digitalmars-d-learn wrote:
 On Thursday, 13 October 2016 at 01:15:22 UTC, Andrei Alexandrescu=C2=A0
 wrote:
 On 10/06/2016 10:32 AM, Nordl=C3=B6w wrote:
 Is there a concept in D similar to Rust's `collect`:
=20
 https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.col
 lect
=20 That's "make" in std.container. Is that what you're looking=C2=A0 for? As an aside, "collect" is an awful abbreviation of=C2=A0 "collection". -- Andrei
=20 I've always thought of it more as "collect the elements of the=C2=A0 iterator into a container".
Java and Rust have gone the same route. collect is a terminal operation creating a data structure given a potentially infinite, lazily evaluated, stream. Rust uses iter for creating a stream from a data structure, Java uses stream or parallelstream. Java's parallelstream seems to be missing from Rust, but there is Rayon to provide a version. D's std.parallelism does something of this, but it needs more work to provide the tree-structured as well as scatter=E2=80=93gather internal parallelism models. --=20 Russel. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D Dr Russel Winder t: +44 20 7585 2200 voip: sip:russel.winder ekiga.n= et 41 Buckmaster Road m: +44 7770 465 077 xmpp: russel winder.org.uk London SW11 1EN, UK w: www.russel.org.uk skype: russel_winder
Oct 12 2016
parent reply =?UTF-8?B?Tm9yZGzDtnc=?= <per.nordlow gmail.com> writes:
On Thursday, 13 October 2016 at 05:07:26 UTC, Russel Winder wrote:
 Java and Rust have gone the same route. collect is a terminal 
 operation creating a data structure given a potentially 
 infinite, lazily evaluated, stream.
Is D somehow better here? For instance, we can use `if (!isInfinite!Range)` to forbid collecting values from an infinite `Range`. Is this checking done? That is `0.iota.make!Array` should not be allowed.
Oct 13 2016
parent =?UTF-8?B?Tm9yZGzDtnc=?= <per.nordlow gmail.com> writes:
On Thursday, 13 October 2016 at 10:00:56 UTC, Nordlöw wrote:
 For instance, we can use `if (!isInfinite!Range)` to forbid 
 collecting values from an infinite `Range`. Is this checking 
 done? That is

     `0.iota.make!Array`

 should not be allowed.
https://github.com/dlang/phobos/pull/4860
Oct 13 2016
prev sibling parent Russel Winder via Digitalmars-d-learn <digitalmars-d-learn puremagic.com> writes:
On Wed, 2016-10-12 at 21:15 -0400, Andrei Alexandrescu via Digitalmars-
d-learn wrote:
 On 10/06/2016 10:32 AM, Nordl=C3=B6w wrote:
 Is there a concept in D similar to Rust's `collect`:
=20
 https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.colle
 ct
=20 That's "make" in std.container. Is that what you're looking for? As an=C2=A0 aside, "collect" is an awful abbreviation of "collection". -- Andrei
I's say collect has an interesting history. Smalltalk used collect for what other called map. Various languages, including Groovy, continued this tradition. Now Rust and Java are using collect as a verb-like form, just as D uses make. collection would be wrong here. --=20 Russel. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D Dr Russel Winder t: +44 20 7585 2200 voip: sip:russel.winder ekiga.n= et 41 Buckmaster Road m: +44 7770 465 077 xmpp: russel winder.org.uk London SW11 1EN, UK w: www.russel.org.uk skype: russel_winder
Oct 12 2016