Skip to content

kulics/gollection

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

67 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

gollection

A generic generic collection library based on go's generic implementation.

Core Interfaces

type Sequence[T any] interface {
	Iterator() Iterator[T]
}

type Iterator[T any] interface {
	Next() option.Option[T]
}

gollection applies the iterator pattern design, the core interface consists of Iterator and Sequence.

Iterator is responsible for providing iterative functionality, Iterator is unidirectional and lazy, each call to next will only return one result.

Sequence is responsible for providing Iterator, the implementation type determines whether the provided Iterator is reusable.

The inert traversal feature allows the combination of higher-order functions without significant overhead and can provide a richer combination of functions.

Here is a simple example of direct traversal:

func printAll[T any](it Sequence[T]) {
	iter := it.Iterator()
	for v, ok := iter.Next().Val(); ok;  v, ok = iter.Next().Val() {
		println(v)
	}
}

Streaming operations

gollection provides a rich set of stream manipulation functions that can be used in combination with any Sequence.

Here is an example of a simple combination used:

func foo() {
	show := func(i int) {
		println(i)
	}
	even := func(i int) bool {
		return i%2 == 0
	}
	square := func(i int) int {
		return i * i
	}
	ForEach(show, Map(square, Filter(even, Slice[int]([]int{1, 2, 3, 4, 5, 6, 7}))))
    // Result:
    // 4
    // 16
    // 36
}

ToString and ToSlice

In order to make go's native string and slice also Sequence, we have introduced ToSlice and ToString to make these two types implement the interface.

var str = "Hello, world!"
var sli = []int{1, 2, 3}
Count(ToString(str)) // 13
Count(ToSlice(sli)) // 3

Collection

We define a unified collection type interface to describe more information than iterators to facilitate performance optimization.

type Collection[T any] interface {
	Sequence[T]

	Count() int
}

func IsEmpty[T any](c Collection[T]) bool
func IsNotEmpty[T any](c Collection[T]) bool
func ToSlice[T any](c Collection[T]) Slice[T]

List and LinkedList

We provide the List and LinkedList types to describe the ordered sequences.

Dict

We provide the Dict type to describe the mapping type.

Set

We provide the Set type to describe the element-unique collection type.

Stack

We provide the Stack type to describe the stack data structure.

Others

We have also introduced several convenient util types for use, and indeed gollection uses them as well. Including Ref, Option, Result.

About

go generic collections

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages