Skip to content

Latest commit

 

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

iter

Simple tools for container iteration

DESCRIPTION

iter and its sub-packages provide a set of utilities to make it easy for providers of objects that are iteratable.

For example, if your object is map-like and you want a way for users to iterate through all or specific keys in your object, all you need to do is to provide a function that iterates through the pairs that you want, and send them to a channel.

Then you create an iterator from the channel, and pass the iterator to the user. The user can then safely iterate through all elements

Channel-based iterator

Iterators pass its values via channels. Your implementation must provide a "source" that writes to this channel.

func iterate(ch chan *mapiter.Pair) {
  ch <- &mapiter.Pair{Key: "key1", Value: ...}
  ch <- &mapiter.Pair{Key: "key2", Value: ...}
  ...
  // DO NOT forget to close the channel
  close(ch)
}

ch := make(chan *mapiter.Pair)
go iterate(ch)

for iter := mapiter.New(ch); i.Next(ctx); {
  pair := i.Pair()
  ...
}

Convenience functions

As long as an object implements the appropriate method, you can use the convenience functions

fn := func(k string, v interface{}) error {
  ...
}

mapiter.Walk(ctx, source, mapiter.VisitorFunc(fn))

There are also functions to convert map-like objects to a map, and array-like objects to an array/slice

var l []string
err := arrayiter.AsArray(ctx, obj, &l)

var m map[string]int
err := mapiter.AsMap(ctx, obj, &m)

Iterate over native containers (map/array)

m := make(map[...]...) // key and value may be any type

for iter := mapiter.Iterate(ctx, m); iter.Next(ctx); {
	...
}
s := make([]...) // element may be any type

for iter := arrayiter.Iterate(ctx, s); iter.Next(ctx); {
  ...
}

About

Iterator tools

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages