Releases: samber/lo
v1.53.0
Announcing the latest release of lo with lots of good gifts! 🎁
🌊 First, a big thanks to @d-enk for making lots of performance improvements in the recent weeks.
🧪 Second, this release introduces a new simd experimental package. If you run on an amd64 architecture and a recent CPU, you can perform very fast operations thanks to SIMD CPU instructions.
-> Documentation: https://lo.samber.dev/docs/experimental/simd
💥 Third, this version adds *Err variants of many lo helpers (like MapErr, FlatMapErr, ReduceErr, etc.) whose callbacks can return an error and short-circuit execution when one occurs.
Note
The simd sub-package is considered not stable. We might break the initial API based on developers' feedback in the coming months.
Features & improvements
- feat: adding SIMD helpers by @samber in #801
- feat: adding Error variants: MapErr, FlatMapErr, ReduceErr... by @samber in #823
- feat: support for buffer iterator by @mimol91 in #824
- feat: add Take, TakeWhile, FilterTake, Window, and Sliding functions by @juliazadorozhnaya in #760
- feat: add a Concat slice function. by @FGasper in #714
- feat: add iterator slice helpers by @juliazadorozhnaya in #791
- feat(it): adding loit.Concat by @samber in #722
- feat: Allow Union/Intersect to take many lists by @frankywahl in #181
- feat: Add Clone function to return shallow copy of slice collections by @quexer in #732
- feat: IntersectBy by @ghosx in #653
- feat: Support Custom Assert by @RelicOfTesla in #755
- feat: Must support Custom error handler. by @RelicOfTesla in #752
- feat: WithoutNth handle non-comparable types by @urisimchoni in #774
- refactor: remove unnecessary type arguments in
NewThrottleby @d-enk in #773 - refactor: lo.IntersectBy + adding loit.IntersectBy + adding doc by @samber in #739
- fix: rename IsSortedByKey to IsSortedBy by @NathanBaulch in #735
- fix(iter/tuples): support break iteration over Zip[By] seq by @d-enk in #757
- fix(it.Mode): align behavior with lo.Mode and ensure consistent slice… by @intojhanurag in #711
- fix: improve Clone function to preserve nilness and avoid liveness issues by @quexer in #740
- fix: reset n counter per iteration in it.Replace by @LikimiaD in #799
- fix: make Ellipsis operate on runes instead of bytes to prevent Unicode truncation by @veeceey in #796
- fix: correct
DropByIndexhandling of negative indices out of bounds by @d-enk in #778
Deprecation
Performance improvements
- feat: Optimize UniqMap to reduce unnecessary slice preallocation by @ivolkoff in #710
- refactor(it): simplify DropLast, TrimSuffix, TrimPrefix and use range loops by @d-enk in #782
- bench: fix iterators to actually iterate in benchmarks by @d-enk in #781
- refactor: simplify slice cut/trim prefix/suffix functions by @d-enk in #787
- perf: optimize Sliding by pre-allocating result capacity by @d-enk in #783
- refactor: improve SamplesBy performance and revert non-panic behavior for negative count by @d-enk in #786
- feat(perf): speed up some functions with linear complexity O=n2 -> O=2n by @samber in #726
- perf: only allocate a single map in Intersect by @NathanBaulch in #736
- perf: preallocate Words string buffer by @NathanBaulch in #728
- refactor: improve lo[it].Intersect[By] readability and performance by @d-enk in #756
- perf: preallocate result slice in
SamplesByby @d-enk in #766 - perf: optimize
PartitionByby eliminating redundant append by @d-enk in #765 - perf: correct prealloc of the result in
FindUniques/Duplicates[By]by @d-enk in #764 - perf: use
Ternary()insteadIf().Else()inRange/RangeFromby @d-enk in #770 - perf: optimize it.Trim to use DropLastWhile(DropWhile(...)) by @d-enk in #780
- perf: replace Min/Max(Range) with Min/MaxIndexBy in DispatchingStrategy by @d-enk in #779
- perf: preallocate result slice in RangeWithSteps by @d-enk in #820
- perf: avoid unnecessary error allocation in NthOr, NthOrEmpty by @d-enk in #817
- perf: optimize Zip and ZipBy functions by @d-enk in #818
- perf: lazy it.Reverse iteration instead of in-place mutation by @d-enk in #814
- perf: optimize Substring to work directly with strings instead of converting to runes by @d-enk in #822
- perf: optimize it.CountBy by removing Filter iterator chain by @d-enk in #813
- perf: optimize it.Find to avoid unnecessary allocations by @d-enk in #811
- perf: optimize it.ContainsBy/EveryBy/SomeBy/NoneBy to avoid unnecessary allocations by @d-enk in #812
- refactor: simplify for loop by @d-enk in #772
- refactor: remove some redundant checks by @d-enk in #771
- refactor: simplify
it.HasSuffiximplementation by @d-enk in #767 - refactor: improve Slice logic and fix docstring by @d-enk in #785
Thanks @d-enk !!
Other (doc, tests, style...)
- test: adding missing test cases to ellipsis by @samber in #809
- fix(test): Increase timeout values in concurrency tests by @samber in #775
- refactor: reorganize llms.txt and add missing helpers by @samber in #723
- Fix Clone() go playground link in README by @sethisernhagen in #761
- Intersect CI test fix by @frankywahl in #731
- lint: fix inconsistent callback function parameter names by @NathanBaulch in #730
- style: fix linter by @samber in #802
- fix: update Play links for Async functions in concurrency.go by @Weeranieb in #724
- lint: use Keyify internally by @NathanBaulch in #691
- Fix references to "lo" instead of "ro" by @pgr0ss in #713
- style: reduce the number of files in root directory by @samber in #719
- style: move img/ directory into docs/static/img by @samber in #721
- refactor: use separate variables for each iter.Pull in it.Zip functions by @d-enk in #816
- refactor: remove redundant map zero value initialization in throttleBy by @d-enk in #815
- doc: explain chunkstring inconsistency by @samber in #789
- doc: fix package name from "lo" to "it" by @samber in #794
- doc(exp,simd): adding warning about API stability for code under exp/ by @samber in #808
- doc(maxby): adding comment to explain inconsistency by @samber in #727
- doc: adding some conventions for callback naming by @samber in #738
- docs: fix typos by @alexandear in #745
- chore(tests): some test improvements by @samber in #725
- chore(ci): improve go version management in CI by @samber in #806
- chore(ci): adding codeql by @samber in #819
- style(simd): rename sse to avx by @samber in #821
Dependencies
- chore(deps): bump lodash from 4.17.21 to 4.17.23 in /docs by @dependabot[bot] in #777
- chore(deps): bump webpack from 5.102.0 to 5.105.0 in /docs by @dependabot[bot] in #793
- chore(deps): bump actions/setup-node from 5 to 6 by @dependabot[bot] in #716
- chore(deps): bump marked from 16.3.0 to 16.4.1 in /docs by @dependabot[bot] in #717
- chore(deps): bump js-yaml from 3.14.1 to 3.14.2 in /docs by @dependabot[bot] in #741
- chore(deps): bump node-forge from 1.3.1 to 1.3.2 in /docs by @dependabot[bot] in #744
- chore(deps): bump ajv from 6.12.6 to 6.14.0 in /docs by @dependabot[bot] in https://github.c...
v1.52.0
Thrilled to announce the latest release of samber/lo!
This version brings major improvements:
- A new
it/sub-package for everything related to theiterpackage added in Go 1.23. Big up to @NathanBaulch for its help on this - A new documentation -> lo.samber.dev
- Lots of micro fixes and performance improvements
- Better code quality with many more linters
✨ A good introduction to streams in Go !
What's Changed
- fix(chunk): Copy chunk in a new slice by @samber in #648
- fix(zipx): fix the max length calculation by @samber in #649
- fix(retry): fix potential race condition in debounce callback by @samber in #650
- feature: add Mode function with tests and documentation by @ghosx in #644
- add FilterKeys for map by @rasha108bik in #631
- feat: adding FilterValues and fix FilterKeys signature by @samber in #661
#662 - fix: more consistent panic strings by @NathanBaulch in #678
- fix: minor example issues by @NathanBaulch in #676
- feat: preserve type alias in DropByIndex and WithoutBy by @NathanBaulch in #675
- feat: adding hassuffix + hasprefix by @samber in #680
- Added Cut, CutPrefix, CutSuffix by @xelavopelk in #666
- Add TrimXXX helpers by @samber in #683
- fix(string): fix division by zero by @samber in #684
- fix: avoid recover() if possible by @NathanBaulch in #685
- fix: panic when passing -1 to Drop by @NathanBaulch in #688
- perf: avoid Keyify twice in Trim by @NathanBaulch in #689
- feat: new iter package by @NathanBaulch in #672
- feat: from slice to map with index passed by @mabrarov in #697
- feat: from slice/iterator to map with index passed by @mabrarov in #698
- feat(generator): deprecate lo.Generator in favor of go "iter" package by @samber in #700
- perf: optimization of map access by @mabrarov in #692
- perf: optimize map access everywhere by @NathanBaulch in #693
Tests
Style
- lint: unit test improvements by @NathanBaulch in #674
- lint: fix CI warnings and avoid named return parameters by @NathanBaulch in #682
- lint: enable 7 more linters by @NathanBaulch in #686
- lint: enable gofumpt extra rules by @NathanBaulch in #690
- Style/rename internal rand by @samber in #701
- lint: Apply testifylint linter recommendations by @NathanBaulch in #669
- Style add golangci config by @samber in #670
- chore: minor whitespace fixes by @NathanBaulch in #677
Documentation
- New documentation for "lo" 🎨 by @samber in #703
- doc: add it/mutable/parallel sub-package to llms.txt by @samber in #707
- docs: lots of various doc improvements by @samber in #706
- docs: adding go playground examples to it/ package by @samber in #708
- docs: Fix the Markdown syntax that is not displaying correctly by @mengxunQAQ in #658
- doc: add examples for find.go by @samber in #681
- docs: Fix Product and ProductBy documentation by @markhildreth-gravity in #647
- chore(deps-dev): bump typescript from 5.6.3 to 5.9.3 in /docs by @dependabot[bot] in #704
- docs: grammar improvements by @NathanBaulch in #673
Other
- chore(deps): bump actions/setup-go from 5 to 6 by @dependabot[bot] in #695
- chore(deps): bump github.com/stretchr/testify from 1.11.0 to 1.11.1 by @dependabot[bot] in #663
- chore(deps): bump actions/checkout from 4 to 5 by @dependabot[bot] in #659
- chore(deps): bump github.com/stretchr/testify from 1.10.0 to 1.11.0 by @dependabot[bot] in
New Contributors
- @markhildreth-gravity made their first contribution in #647
- @rasha108bik made their first contribution in #631
- @xelavopelk made their first contribution in #666
- @mabrarov made their first contribution in #692
Full Changelog: v1.51.0...v1.52.0
v1.51.0
What's Changed
- Fixed the error in the usage example of lo.Latest in readme.md by @ghosx in #627
- feat(assertions): add
AssertandAssertfby @your-diary in #638
Doc
- docs: Add a more precise description to the Ellipsis function by @mengxunQAQ in #635
- docs: Fix description for LastOrEmpty and LastOr by @vaihtovirta in #636
- docs: fix wrong variable name for mutable map example by @sunjayaali in #637
Dependencies
- fix(ci): correct cleanup deps - remove all *_test.go files using find by @d-enk in #630
- Revert "chore(deps): bump golang.org/x/text from 0.22.0 to 0.24.0" by @samber in #626
- chore(deps): bump golang.org/x/text from 0.22.0 to 0.24.0 by @dependabot in #625
- chore(deps): bump golangci/golangci-lint-action from 7 to 8 by @dependabot in #628
New Contributors
- @ghosx made their first contribution in #627
- @mengxunQAQ made their first contribution in #635
- @vaihtovirta made their first contribution in #636
- @your-diary made their first contribution in #638
Full Changelog: v1.50.0...v1.51.0
v1.50.0
What's Changed
Here is the 50th minor version !! 🔥🥂
New methods
- Implemented GroupByMap by @maryum375 in #443
- feat: Add NthOr and NthOrEmpty functions by @edvardsanta in #611
- feat: adding FilterMapToSlice by @samber in #623
- feat(mutable): adding Map, MapI, Filter, FilterI by @samber in #577
- Add ElementsMatch, ElementsMatchBy by @senago in #589
Improvements
- Perf(slice): Optimize iteration function parameters and add test cases by @shuqingzai in #587
- Preallocate result in FilterMap by @renbou in #622
Documentation
- docs: modify mutable.shuffle example code and Go Playground links by @ebina4yaka in #595
- fix: Issue 605 (README for Ternary() by @peterhoward42 in #606
- docs: add play link for ChunkEntries example in README by @oswaldom-code in #600
- doc: update CoalesceXXX demo and result by @jialeicui in #594
- docs: fix typo in readme by @ahmedabdou14 in #620
Dependencies
- chore(deps): bump golang.org/x/text from 0.21.0 to 0.22.0 by @dependabot in #590
- chore(deps): bump golang.org/x/text from 0.22.0 to 0.24.0 by @dependabot in #618
- chore(deps): bump golangci/golangci-lint-action from 6 to 7 by @dependabot in #616
New Contributors
- @maryum375 made their first contribution in #443
- @shuqingzai made their first contribution in #587
- @ebina4yaka made their first contribution in #595
- @jialeicui made their first contribution in #594
- @peterhoward42 made their first contribution in #606
- @edvardsanta made their first contribution in #611
- @ahmedabdou14 made their first contribution in #620
- @renbou made their first contribution in #622
Full Changelog: v1.49.1...v1.50.0
v1.49.1
What's Changed
Full Changelog: v1.49.0...v1.49.1
v1.49.0
What's Changed
- feat: add SampleBy and SamplesBy by @bramvandewalle in #516
- feat: Add IsNotNil by @haoxins in #523
- feat: Implement ChunkMap Function (#533) by @oswaldom-code in #538
- feat: Add NewThrottle by @Lee-Minjea in #427
- feat: adding FilterSliceToMap by @samber in #581
- feat: add
ProductandProductByfunctions by @JohnDevitt in #566
New Contributors
- @bramvandewalle made their first contribution in #516
- @oswaldom-code made their first contribution in #538
- @Lee-Minjea made their first contribution in #427
Full Changelog: v1.48.0...v1.49.0
v1.48.0
What's Changed
Feature
- feat: add (Min|Max)Index(By) by @aria3ppp in #569
- feat: add UniqMap by @nicklaus-dev in #527
- feat: add CrossJoin function by @JohnDevitt in #567
- feat: Implement CoalesceOrEmptySlice Function by @chg1f in #542
- feat: adding WithoutNth by @samber in #575
- feat: deprecate lo.Reverse and move it to lom.Reverse by @samber in #576
- feat: deprecate lo.Shuffle and move it to lom.Shuffle by @samber in 699707a#comments
- feat: adding lo.BufferWithContext by @samber in #580
- feat: add SliceToSet by @nicklaus-dev in #514
- feat: add WithoutBy by @nicklaus-dev in #515
- feat: add lom.Fill by @samber
Fix
- fix: change examples for MapKeys and MapValues by @luxcgo in #341
- fix: order of GroupBy and PartitionBy by @liyishuai in #572
Refactor
- refactor RandomString function by @pigwantacat in #524
New Contributors
- @luxcgo made their first contribution in #341
- @haoxins made their first contribution in #522
- @muya made their first contribution in #521
- @NathanBaulch made their first contribution in #519
- @jiz4oh made their first contribution in #535
- @guyareco2 made their first contribution in #537
- @pigwantacat made their first contribution in #524
- @snamiki1212 made their first contribution in #541
- @dependabot made their first contribution in #554
- @JasonnnW3000 made their first contribution in #571
- @liyishuai made their first contribution in #572
- @aria3ppp made their first contribution in #569
- @sunjayaali made their first contribution in #544
- @SnowOnion made their first contribution in #543
- @nicklaus-dev made their first contribution in #527
- @JohnDevitt made their first contribution in #567
- @chg1f made their first contribution in #542
Full Changelog: v1.47.0...v1.48.0
v1.47.0
What's Changed
- feat: Improve Substring by @liujundezhanghao in #496
- doc: Wrong method reference and output in readme by @ColeZia in #497
- doc: Fix documentation for Duration3 by @gecko655 in #502
- feat: add FromSlicePtr by @mash in #217
- feat: adding FromSlicePtrOr by @samber in #506
- feat: Keys+Values: accept multiple maps (vaargs) - Adding UniqKeys+UniqValues by @shivamrazorpay in #503
- doc: Update foreachwhile readme.md by @Sianao in #508
New Contributors
- @liujundezhanghao made their first contribution in #496
- @ColeZia made their first contribution in #497
- @gecko655 made their first contribution in #502
- @mash made their first contribution in #217
- @shivamrazorpay made their first contribution in #503
Full Changelog: v1.46.0...v1.47.0
v1.46.0
What's Changed
- fix: chunk memory leak, bug fix by @mihir20 in #491
- feat: add WaitForWithContext by @ccoVeille in #480
- add ForEachCondition implement by @Sianao in #485
New Contributors
- @mihir20 made their first contribution in #491
- @ccoVeille made their first contribution in #480
- @Sianao made their first contribution in #485
Full Changelog: v1.45.0...v1.46.0