Re: Rust-like collect in D

2016-10-13 Thread Nordlöw via Digitalmars-d-learn

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


Re: Rust-like collect in D

2016-10-12 Thread Russel Winder via Digitalmars-d-learn
On Wed, 2016-10-12 at 21:15 -0400, Andrei Alexandrescu via Digitalmars-
d-learn 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.colle
> > ct
> 
> 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'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.

-- 
Russel.
=
Dr Russel Winder  t: +44 20 7585 2200   voip: sip:russel.win...@ekiga.net
41 Buckmaster Roadm: +44 7770 465 077   xmpp: rus...@winder.org.uk
London SW11 1EN, UK   w: www.russel.org.uk  skype: russel_winder

signature.asc
Description: This is a digitally signed message part


Re: Rust-like collect in D

2016-10-12 Thread Russel Winder via Digitalmars-d-learn
On Thu, 2016-10-13 at 02:33 +, Meta via Digitalmars-d-learn wrote:
> 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.col
> > > lect
> > 
> > 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".

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–gather internal
parallelism models.

-- 
Russel.
=
Dr Russel Winder  t: +44 20 7585 2200   voip: sip:russel.win...@ekiga.net
41 Buckmaster Roadm: +44 7770 465 077   xmpp: rus...@winder.org.uk
London SW11 1EN, UK   w: www.russel.org.uk  skype: russel_winder

signature.asc
Description: This is a digitally signed message part


Re: Rust-like collect in D

2016-10-12 Thread Meta via Digitalmars-d-learn
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".


Re: Rust-like collect in D

2016-10-12 Thread Andrei Alexandrescu via Digitalmars-d-learn

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


Re: Rust-like collect in D

2016-10-06 Thread ag0aep6g via Digitalmars-d-learn

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


Re: Rust-like collect in D

2016-10-06 Thread ag0aep6g via Digitalmars-d-learn

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;
}



Re: Rust-like collect in D

2016-10-06 Thread Nordlöw via Digitalmars-d-learn

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.


Re: Rust-like collect in D

2016-10-06 Thread Dicebot via Digitalmars-d-learn

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;
}


Re: Rust-like collect in D

2016-10-06 Thread Jonathan M Davis via Digitalmars-d-learn
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




Re: Rust-like collect in D

2016-10-06 Thread Nordlöw via Digitalmars-d-learn

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


Re: Rust-like collect in D

2016-10-06 Thread Nordlöw via Digitalmars-d-learn

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.


Re: Rust-like collect in D

2016-10-06 Thread Dicebot via Digitalmars-d-learn

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);


Re: Rust-like collect in D

2016-10-06 Thread cym13 via Digitalmars-d-learn

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.


Re: Rust-like collect in D

2016-10-06 Thread Nordlöw via Digitalmars-d-learn
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.


Re: Rust-like collect in D

2016-10-06 Thread rikki cattermole via Digitalmars-d-learn

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.