Genesis
Generic functions for Go. Bringing the beauty of functional programming in Go 1.18+.
π Features:
- π οΈ Over 170 generic functions for channels, maps, and slices.
- πͺ Uses the power of Go 1.18+ generics.
- π§ No code generation.
- πͺΆ No dependencies (except is for testing).
- π Pure Go.
- πͺ© Sync and async versions of all the main functions.
π¨ When to use:
- π In a big project. More the project grows, more you find yourself writing boring generic code like "Min". Break the cycle.
- π€ In a team project. Each line of code you write means higher maintenance cost that in turn means loosing time and money.
- πΆ In a pet project. Leave the boring stuff to us, focus on the fun parts.
- π When readability matters.
slices.Shrink
is a function with a human-friendly name and documentation.s[:len(s):len(s)]
is a jibberish and black magic. Prefer the former. - π When you miss some conveniences that come in other languages out-of-the-box.
- π When you write a highly concurrent code and don't want to manually implement code for cancellation, results collection and ordering, worker groups, context, etc.
π¦ What's inside:
Filter
,Map
, andReduce
for data processing on steroids.FilterAsync
,MapAsync
, andReduceAsync
for making your code fast and concurrent with a single line of code.Grow
andShrink
for reducing memory allocations.Permutations
andProduct
for simple iterations.Shuffle
andSort
for randomization.Any
andAll
for simple flow control.Range
,Count
, andCycle
for generating sequences.
And much more.
πΎ Installation
go get github.com/life4/genesis
π Examples
Find the minimal value in a slice of ints:
lambdas.Must(slices.Min([]int{42, 7, 13})) == 7
Double values in a slice of ints:
slices.Map([]int{4, 8, 15}, func(el int) int { return el * 2 })
Concurrently check status codes for multiple URLs:
urls := []string{
"https://go.dev/",
"https://golang.org/",
"https://google.com/",
}
codes := slices.MapAsync(
urls, 0,
func(url string) int {
return lambdas.Must(http.Get(url)).StatusCode
},
)
π¨ Usage
Genesis contains the following packages:
- π slices: generic functions for slices (
[]T
). - πΊ maps: generic functions for maps (
map[K]V
). - πΊ channels: generic function for channels (
chan T
). - βοΈ sets: generic function for sets (
map[T]struct{}
). - π lambdas: helper generic functions to work with
slices.Map
and similar.
See π DOCUMENTATION for more info.