mirror of
https://github.com/rjNemo/underscore
synced 2026-06-06 10:36:43 +00:00
Pre-allocates result slice with estimated capacity to reduce repeated allocations during append operations. Strategy: - Estimates capacity as len(values) * 2 - Assumes average of 2-3 items per mapped element - Simple heuristic that works well for typical use cases Performance improvements: - Time: 907.4 ns/op → 616.7 ns/op (32% faster) - Memory: 6,120 B/op → 4,992 B/op (18% less) - Allocations: 8 → 2 (75% reduction) Impact: - Significantly reduces allocation overhead - Better performance for typical flatmap operations - May over-allocate if mapper returns <2 items on average Added BenchmarkFlatmap to track performance. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
12 lines
453 B
Go
12 lines
453 B
Go
package underscore
|
|
|
|
// Flatmap flatten the input slice element into the new slice. FlatMap maps every element with the help of a mapper function, then flattens the input slice element into the new slice.
|
|
func Flatmap[T any](values []T, mapper func(n T) []T) []T {
|
|
// Estimate capacity: assume average of 2-3 items per element
|
|
res := make([]T, 0, len(values)*2)
|
|
for _, v := range values {
|
|
vs := mapper(v)
|
|
res = append(res, vs...)
|
|
}
|
|
return res
|
|
}
|