mirror of
https://github.com/rjNemo/underscore
synced 2026-06-06 02:26:42 +00:00
BREAKING CHANGE: Drop function now correctly drops first N elements
instead of removing element at specific index.
Changes:
- Renamed old Drop behavior to RemoveAt function
- Implemented correct Drop semantics (drop first N elements)
- Added comprehensive tests for both functions
Drop (NEW behavior):
- Drop([]int{1,2,3,4,5}, 2) → [3,4,5] (drops first 2 elements)
- Returns empty slice if n >= len(values)
- Returns original slice if n <= 0
RemoveAt (OLD Drop behavior):
- RemoveAt([]int{1,2,3,4,5}, 2) → [1,2,4,5] (removes index 2)
- Returns original slice if index out of bounds
- Pre-allocates with capacity len(values)-1
Tests added:
- Drop: 5 tests (basic, none, all, empty, single)
- RemoveAt: 6 tests (basic, first, last, bounds, empty, single)
Documentation updated:
- README.md: Added RemoveAt to function list
- CLAUDE.md: Marked Drop semantics as fixed
- ACTION_PLAN.md: Updated completion status
Migration guide:
- Old: Drop(slice, index) → New: RemoveAt(slice, index)
- New Drop usage: Drop(slice, n) drops first n elements
Coverage: 98.8% (maintained)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
213 lines
5.3 KiB
Markdown
213 lines
5.3 KiB
Markdown
# \_Underscore
|
|
|
|

|
|
[](https://pkg.go.dev/github.com/rjNemo/underscore)
|
|

|
|

|
|
[](https://www.bestpractices.dev/projects/9726)
|
|
|
|

|
|
|
|
`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](https://underscore.onrender.com/).
|
|
|
|
Install the library using
|
|
|
|
```sh
|
|
go get github.com/rjNemo/underscore@latest
|
|
```
|
|
|
|
Please check out the [examples](examples) to see how to use the library.
|
|
|
|
```go
|
|
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](Dockerfile)
|
|
based on `go1.24`.
|
|
|
|
If you prefer local development, navigate to the [official
|
|
download page](https://go.dev/dl/) and install version `1.24` or beyond.
|
|
|
|
### Installing
|
|
|
|
First clone the repository
|
|
|
|
```sh
|
|
git clone https://github.com/rjNemo/underscore.git
|
|
```
|
|
|
|
Install dependencies
|
|
|
|
```sh
|
|
go mod download
|
|
```
|
|
|
|
And that's it.
|
|
|
|
## Tests
|
|
|
|
To run the unit tests, you can simply run:
|
|
|
|
```sh
|
|
make test
|
|
```
|
|
|
|
## Functions
|
|
|
|
`underscore` provides many of functions that support your favorite functional helpers
|
|
|
|
### Collections
|
|
|
|
- `All`
|
|
- `Any`
|
|
- `Chunk`
|
|
- `Contains`
|
|
- `ContainsBy`
|
|
- `Count`
|
|
- `Difference`
|
|
- `Drop`
|
|
- `Each`
|
|
- `Filter`
|
|
- `Find`
|
|
- `Flatmap`
|
|
- `GroupBy`
|
|
- `Intersection`
|
|
- `Join` / `JoinProject`
|
|
- `Last`
|
|
- `Map`
|
|
- `Max`
|
|
- `Min`
|
|
- `OrderBy`
|
|
- `Partition`
|
|
- `Range`
|
|
- `Reduce`
|
|
- `RemoveAt`
|
|
- `Sum` / `SumMap`
|
|
- `Unique`
|
|
- `UniqueBy`
|
|
- `UniqueInPlace`
|
|
- `Zip`
|
|
|
|
### 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.
|
|
|
|
```go
|
|
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>
|
|
}
|
|
```
|
|
|
|
```go
|
|
// 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 helper
|
|
- `ToPointer`: convert values to pointers
|
|
- `SortSliceASC` / `SortSliceDESC`: sort slices in ascending or descending order
|
|
- `Result`, `Ok`, `Err`, `ToResult`: Result type for error handling
|
|
- `Tuple`: generic tuple type for paired values
|
|
|
|
### Subpackages
|
|
|
|
- `maps.Keys(m)` / `maps.Values(m)`: extract keys or values from maps
|
|
- `maps.Map(m, fn)`: transform map entries
|
|
|
|
## Built With
|
|
|
|
- [Go](https://go.dev/) - Build fast, reliable, and efficient software at scale
|
|
|
|
## Contributing
|
|
|
|
Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct,
|
|
and the process for submitting pull requests to us.
|
|
|
|
## Versioning
|
|
|
|
We use [SemVer](http://semver.org/) for versioning. For the versions available, see
|
|
the [tags on this repository](https://github.com/rjNemo/underscore/tags).
|
|
|
|
## Authors
|
|
|
|
- **Ruidy** - _Initial work_ - [Ruidy](https://github.com/rjNemo)
|
|
|
|
See also the list of [contributors](https://github.com/rjNemo/underscore/contributors)
|
|
who participated in this project.
|
|
|
|
## License
|
|
|
|
This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md)
|
|
file for details
|
|
|
|
## Acknowledgments
|
|
|
|
This project is largely inspired by [Underscore.js](https://underscorejs.org/#)
|
|
library. Check out the original project if you don't already know it.
|