www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 9868] New: Hash iteration should support counter variable

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=9868

           Summary: Hash iteration should support counter variable
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: andrej.mitrovich gmail.com



12:10:58 PDT ---
void main()
{
    string[string] hash;
    foreach (i, key, val; hash)  // ng
    {
    }
}

I think it would be nice to support this, it allows for things like:

void main()
{
    string[string] hash = ["foo":"1", "bar":"2"];

    string res;
    foreach (i, key, val; hash)  // ng
    {
        if (i) res ~= ", ";
        res ~= key ~ " " ~ val;
    }

    assert(res == "foo 1, bar 2");
}

A map + joiner call would suffice here of course.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Apr 03 2013
next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=9868


Martin Nowak <code dawg.eu> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |code dawg.eu



The problem is there is no index in an unsorted map.
But using the known counter from array foreach makes it appear as if there was
a relation between i and key/value.
I don't think it's worth the possible confusion.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Apr 06 2013
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=9868


Andrej Mitrovic <andrej.mitrovich gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |WONTFIX



04:24:03 PDT ---
Fair enough. Here's a library workaround when it's really needed:

----
import std.stdio;
import std.traits;

struct Walk(Hash)
    if (isAssociativeArray!Hash)
{
    Hash hash;

    int opApply(int delegate(size_t idx, KeyType!Hash key, ValueType!Hash val)
dg)
    {
        int result = 0;

        size_t idx;
        foreach (key, val; hash)
        {
            result = dg(idx++, key, val);
            if (result)
                break;
        }

        return result;
    }
}

auto walk(Hash)(Hash hash)
    if (isAssociativeArray!Hash)
{
    return Walk!Hash(hash);
}

void main()
{
    string[string] hash = ["f" : "foo", "b" : "bar"];

    foreach (i, key, val; hash.walk)
    {
        writefln("%s %s %s", i, key, val);
    }
}
----

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Apr 07 2013