• Eric Myhre's avatar
    Iterator refactor: entry-based, for map and list. · b84e99cd
    Eric Myhre authored
    We now have both MapIterator and ListIterator interfaces.
    Both return key-value (or index-value) pairs, rather than just keys.
    
    List iterators may seem a tad redundant: you just loop over the length,
    right?  Well, sure.  But there's one place a list iterator shines:
    selecting only a subset of elements.  And indeed, we'll be doing
    exactly that in the traversal/selector package; therefore, we
    definitely need list iterators.
    
    We might want keys-only iterators again in the future, but at present,
    I'm deferring that.  It's definitely true that we should have iterators
    returning values as a core feature, since they're likely to be more
    efficiently supportable than "random" access (especially when we get to
    some Advanced Layout data systems), so we'll implement those first.
    
    Additionally, note that MapIterator now returns a Node for the key.
    This is to account for that fact that when using the schema system and
    typed nodes, map keys can be more *specific* types.  Such nodes are
    still required to be kind==ReprKind_String, but string might not be
    their *preferred* native format (think: tuples with serialized to be
    delimiter-separated strings); we need to account for that.
    (MapBuilder.Insert method already takes a Node parameter for similar
    reasons: so it can take *typed* nodes.  Node.TraverseField accepting
    a plain string is the oddball out here, and should be rectified.)
    Signed-off-by: default avatarEric Myhre <hash@exultant.us>
    b84e99cd
node.go 6.72 KB