š underscore - Awesome Go Library for Functional

Functional programming helpers for Go 1.18 and beyond
Detailed Description of underscore
_Underscore

underscore is a Go library providing useful functional programming helpers without
extending any built-in objects.
It is mostly a port from the underscore.js library based on generics brought by
Go 1.18.
Usage
š Follow this link for the documentation.
Install the library using
go get github.com/rjNemo/underscore@latest
Please check out the examples to see how to use the library.
package main
import (
"fmt"
u "github.com/rjNemo/underscore"
)
func main() {
numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
// filter even numbers from the slice
evens := u.Filter(numbers, func(n int) bool { return n%2 == 0 })
// square every number in the slice
squares := u.Map(evens, func(n int) int { return n * n })
// reduce to the sum
res := u.Reduce(squares, func(n, acc int) int { return n + acc }, 0)
fmt.Println(res) // 120
}
Getting Started
These instructions will get you a copy of the project up and running on your local machine for development and testing purposes.
Prerequisites
You need at least go1.24 for development. The project is shipped with a Dockerfile
based on go1.24.
If you prefer local development, navigate to the official
download page and install version 1.24 or beyond.
Installing
First clone the repository
git clone https://github.com/rjNemo/underscore.git
Install dependencies
go mod download
And that's it.
Tests
To run the unit tests, you can simply run:
make test
Functions
underscore provides many of functions that support your favorite functional helpers
Collections
AllAnyChunkContainsContainsByCountDifferenceDropEachFilterFindFlatmapGroupByIntersectionJoin/JoinProjectLastMapMaxMinOrderByPartitionRangeReduceRemoveAtSum/SumMapUniqueUniqueByUniqueInPlaceZip
Pipe
Calling NewPipe will cause all future method calls to return wrapped values. When
you've finished the computation, call Value to retrieve the final value.
Methods not returning a slice such as Reduce, All, Any, will break the Chain
and return Value instantly.
Concurrency
ParallelMap(ctx, values, workers, fn): apply a function concurrently while preserving order and supporting context cancellation.ParallelFilter(ctx, values, workers, fn): filter concurrently with order preserved and context support.
package main
import (
"context"
"fmt"
u "github.com/rjNemo/underscore"
)
func main() {
out, err := u.ParallelMap(context.Background(), []int{1, 2, 3, 4}, 4,
func(ctx context.Context, n int) (int, error) { return n * n, nil },
)
fmt.Println(out, err) // [1 4 9 16] <nil>
}
// ParallelFilter example
package main
import (
"context"
"fmt"
u "github.com/rjNemo/underscore"
)
func main() {
out, err := u.ParallelFilter(context.Background(), []int{1,2,3,4,5}, 3,
func(ctx context.Context, n int) (bool, error) { return n%2==0, nil },
)
fmt.Println(out, err) // [2 4] <nil>
}
Utilities
Ternary: conditional expression helperToPointer: convert values to pointersSortSliceASC/SortSliceDESC: sort slices in ascending or descending orderResult,Ok,Err,ToResult: Result type for error handlingTuple: generic tuple type for paired values
Subpackages
maps.Keys(m)/maps.Values(m): extract keys or values from mapsmaps.Map(m, fn): transform map entries
Built With
- Go - Build fast, reliable, and efficient software at scale
Contributing
Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests to us.
Versioning
We use SemVer for versioning. For the versions available, see the tags on this repository.
Authors
- Ruidy - Initial work - Ruidy
See also the list of contributors who participated in this project.
License
This project is licensed under the MIT License - see the LICENSE.md file for details
Acknowledgments
This project is largely inspired by Underscore.js library. Check out the original project if you don't already know it.