/genesis

All generic functions for Go 1.18 you ever need!

Primary LanguageGoMIT LicenseMIT

Genesis

Generic functions for Go. Bringing the beauty of functional programming in Go 1.18+.

Features:

  • Over 130 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.
  • For slices and channels.

When to use:

  • In a big project. More the project grows, more you find yourself writing oring generic code like "Min". Break the cyrcle.
  • In a team project. Each like 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, and Reduce for data processing on steroids.
  • FilterAsync, MapAsync, and ReduceAsync for making your code fast and concurrent with a single line of code.
  • Grow and Shrink for reducing memory allocations.
  • Permutations and Product for simple iterations.
  • Shuffle and Sort for randomization.
  • Any and All for simple flow control.
  • Range, Count, and Cycle 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.
  • maps: generic functions for maps.
  • channels: generic function for channels.
  • lambdas: helper generic functions to work with slices.Map and similar.

IMPORTANT: pkg.go.dev doesn't show the documentation for packages with generics just yet (see #48264). Use github to read the source code or browse the documentation locally.

mascot image