collection
Generic go structures
Install
go get github.com/isgj/collection
Usage
collection.Vec[T] implemented as a native go slice []T
. Because of this, other than the few currently
implemented methods you can use Vec
also as a regular slice.
package main
import (
"fmt"
"github.com/isgj/collection"
)
func main() {
strings := collection.Vec[string]{"str1", "str2"}
for i := 3; i < 6; i++ {
strings = append(strings, fmt.Sprintf("str%d", i))
}
sliced := strings[2:4]
indexed := strings[0]
fmt.Printf("len=%d, cap=%d, indexed=%s, sliced=%v\n", len(strings), cap(strings), indexed, sliced)
}
The most noticable method of Vec
is Iter
(or ReverseIter
) which returns a lazy iterator over the
elements of the slice. Check below.
collection.Iterator[T] is a lazy iterator over a list of values of type T
.
package main
import (
"fmt"
"github.com/isgj/collection"
)
func main() {
first_slice := collection.Vec[int]{1, 2, 3, 4, 5}
second_slice := collection.Vec[int]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14}
result := first_slice.
Iter().
FollowedBy(second_slice.ReverseIter()).
Filter(func(item int) bool {
fmt.Printf("will test item: %2d\n", item)
return item%2 == 0
}).
Skip(2).
Take(3).
Collect()
fmt.Printf("len=%d, cap=%d, vec=%v\n", result.Len(), result.Cap(), result)
}
To note: because the iterator is lazy the test of Filter
is not called on each element, but only as much as needed (no wasted calls).
At the end you need to call Collect
to get back a slice. If Collect
is not called nothing gets executed.
collection.Map
collection.Set
collection.DLList
collection.LRUCache