diff --git a/hamt/hamt.go b/hamt/hamt.go index 05b9402fd..7d0e47909 100644 --- a/hamt/hamt.go +++ b/hamt/hamt.go @@ -321,7 +321,15 @@ func (ds *HamtShard) getValue(ctx context.Context, hv *hashBits, key string, cb func (ds *HamtShard) EnumLinks() ([]*node.Link, error) { var links []*node.Link - err := ds.walkTrie(func(sv *shardValue) error { + err := ds.ForEachLink(func(l *node.Link) error { + links = append(links, l) + return nil + }) + return links, err +} + +func (ds *HamtShard) ForEachLink(f func(*node.Link) error) error { + return ds.walkTrie(func(sv *shardValue) error { lnk, err := node.MakeLink(sv.val) if err != nil { return err @@ -329,14 +337,8 @@ func (ds *HamtShard) EnumLinks() ([]*node.Link, error) { lnk.Name = sv.key - links = append(links, lnk) - return nil + return f(lnk) }) - if err != nil { - return nil, err - } - - return links, nil } func (ds *HamtShard) walkTrie(cb func(*shardValue) error) error { diff --git a/io/dirbuilder.go b/io/dirbuilder.go index fdb616e1b..5f0fc2242 100644 --- a/io/dirbuilder.go +++ b/io/dirbuilder.go @@ -102,6 +102,19 @@ func (d *Directory) switchToSharding(ctx context.Context) error { return nil } +func (d *Directory) ForEachLink(f func(*node.Link) error) error { + if d.shard == nil { + for _, l := range d.dirnode.Links() { + if err := f(l); err != nil { + return err + } + } + return nil + } + + return d.shard.ForEachLink(f) +} + func (d *Directory) Links() ([]*node.Link, error) { if d.shard == nil { return d.dirnode.Links(), nil