Re: how to iterate over an AA by key-value pair (tuple)?

2014-02-14 Thread bearophile

Timothee Cour:


auto byKeyValue(){...}


It's probably better to call the method byPair that is shorter.



If I/someone does it, will it be merged in?


Some people want those pairs to be tuples. But D lacks built-in 
tuples, so you need to use typecons ones. But to use the typecons 
ones you need to import half Phobos. It seems there is no good 
solution.


Bye,
bearophile


Re: how to iterate over an AA by key-value pair (tuple)?

2014-02-14 Thread Jakob Ovrum

On Friday, 14 February 2014 at 07:35:34 UTC, Timothee Cour wrote:

That seems like a worthy enhancement.
If I/someone does it, will it be merged in?


I really want it to happen, but I also want it to happen right.

See the relevant pull request[1].

[1] https://github.com/D-Programming-Language/druntime/pull/574


how to iterate over an AA by key-value pair (tuple)?

2014-02-13 Thread Timothee Cour
how to iterate over an AA by key-value pair (tuple)?
use case:
avoid interrupting UFCS chains, eg:
foo.generate_aa.byKeyValue.filter!(a=a[0].isLower).map!(a=a[1]) ...
of course I could roll my own function but I was wondering if there's
already a way.


Re: how to iterate over an AA by key-value pair (tuple)?

2014-02-13 Thread Timothee Cour
is there anything more efficient than this?

auto byKeyValue(T)(T a)if(isAssociativeArray!T){
  return a.byKey.map!(b=tuple(b, a[b]));
}



On Thu, Feb 13, 2014 at 3:56 PM, Timothee Cour thelastmamm...@gmail.comwrote:

 how to iterate over an AA by key-value pair (tuple)?
 use case:
 avoid interrupting UFCS chains, eg:
 foo.generate_aa.byKeyValue.filter!(a=a[0].isLower).map!(a=a[1]) ...
 of course I could roll my own function but I was wondering if there's
 already a way.




Re: how to iterate over an AA by key-value pair (tuple)?

2014-02-13 Thread timotheecour

On Thursday, 13 February 2014 at 23:56:35 UTC, Timothee Cour
wrote:

how to iterate over an AA by key-value pair (tuple)?
use case:
avoid interrupting UFCS chains, eg:
foo.generate_aa.byKeyValue.filter!(a=a[0].isLower).map!(a=a[1]) 
...
of course I could roll my own function but I was wondering if 
there's

already a way.



is there anything more efficient than this?

auto byKeyValue(T)(T a)if(isAssociativeArray!T){
   return a.byKey.map!(b=tuple(b, a[b]));
}


Re: how to iterate over an AA by key-value pair (tuple)?

2014-02-13 Thread bearophile

timotheecour:


is there anything more efficient than this?

auto byKeyValue(T)(T a)if(isAssociativeArray!T){
   return a.byKey.map!(b=tuple(b, a[b]));
}


zipping byKey and byValue could be faster, but there's no 
guarantee its result is correct.


Bye,
bearophile


Re: how to iterate over an AA by key-value pair (tuple)?

2014-02-13 Thread Steven Schveighoffer
On Thu, 13 Feb 2014 19:06:45 -0500, timotheecour  
timothee.co...@gmail.com wrote:



On Thursday, 13 February 2014 at 23:56:35 UTC, Timothee Cour
wrote:

how to iterate over an AA by key-value pair (tuple)?
use case:
avoid interrupting UFCS chains, eg:
foo.generate_aa.byKeyValue.filter!(a=a[0].isLower).map!(a=a[1]) ...
of course I could roll my own function but I was wondering if there's
already a way.



is there anything more efficient than this?

auto byKeyValue(T)(T a)if(isAssociativeArray!T){
return a.byKey.map!(b=tuple(b, a[b]));
}


Of course. The a[b] lookup is significant in the complexity, it's  
amortized constant, and the constant is not always small. Consider that  
all keys and values are already stored in structs inside the AA. With  
low-level access, it would be trivial to make an efficient tuple generator  
that did not need to lookup values by keys.


-Steve


Re: how to iterate over an AA by key-value pair (tuple)?

2014-02-13 Thread Timothee Cour
On Thu, Feb 13, 2014 at 5:50 PM, Steven Schveighoffer
schvei...@yahoo.comwrote:

 On Thu, 13 Feb 2014 19:06:45 -0500, timotheecour timothee.co...@gmail.com
 wrote:

  On Thursday, 13 February 2014 at 23:56:35 UTC, Timothee Cour
 wrote:

 how to iterate over an AA by key-value pair (tuple)?
 use case:
 avoid interrupting UFCS chains, eg:
 foo.generate_aa.byKeyValue.filter!(a=a[0].isLower).map!(a=a[1]) ...
 of course I could roll my own function but I was wondering if there's
 already a way.



 is there anything more efficient than this?

 auto byKeyValue(T)(T a)if(isAssociativeArray!T){
 return a.byKey.map!(b=tuple(b, a[b]));
 }


 Of course. The a[b] lookup is significant in the complexity, it's
 amortized constant, and the constant is not always small. Consider that all
 keys and values are already stored in structs inside the AA. With low-level
 access, it would be trivial to make an efficient tuple generator that did
 not need to lookup values by keys.

 -Steve


That's what I was suspecting,
I guess the code to modify would be here:

druntime/import/object.di:455:5

auto byKeyValue(){...}

auto byKey()
{
static struct Result
{
AARange r;

@property bool empty() { return _aaRangeEmpty(r); }
@property ref Key front() { return
*cast(Key*)_aaRangeFrontKey(r); }
void popFront() { _aaRangePopFront(r); }
Result save() { return this; }
}

return Result(_aaRange(p));
}

That seems like a worthy enhancement.
If I/someone does it, will it be merged in?