rambda 8.4.0 → 8.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,25 @@
1
+ 8.6.0
2
+
3
+ - Wrong typing for `R.dissocPath` - [Issue #709](https://github.com/selfrefactor/rambda/issues/709)
4
+
5
+ - Add `R.sortWith` - [Issue #7097](https://github.com/selfrefactor/rambda/issues/707)
6
+
7
+ - Update build dependencies
8
+
9
+ 8.5.0
10
+
11
+ - Revert changes in `R.anyPass` introduced in `8.4.0` release. The reason is that the change was breaking the library older than `5.2.0` TypeScript.
12
+
13
+ - Wrong `R.partial` TS definition - [Issue #705](https://github.com/selfrefactor/rambda/issues/705)
14
+
15
+ - Add `R.dropRepeatsBy`
16
+
17
+ - Add `R.empty`
18
+
19
+ - Add `R.eqBy`
20
+
21
+ - Add `R.forEachObjIndexed`
22
+
1
23
  8.4.0
2
24
 
3
25
  - Add `R.dissocPath`
package/README.md CHANGED
@@ -59,7 +59,7 @@ Also, `Rambda` provides you with included TS definitions:
59
59
  // Deno extension(https://marketplace.visualstudio.com/items?itemName=denoland.vscode-deno)
60
60
  // is installed and initialized
61
61
  import * as R from "https://deno.land/x/rambda/mod.ts";
62
- import * as Ramda from "https://x.nest.land/ramda@0.27.2/mod.ts";
62
+ import * as Ramda from "https://deno.land/x/ramda/mod.ts";
63
63
 
64
64
  R.add(1)('foo') // => will trigger warning in VSCode as it should
65
65
  Ramda.add(1)('foo') // => will not trigger warning in VSCode
@@ -101,10 +101,6 @@ One of the main issues with `Ramda` is the slow process of releasing new version
101
101
  Click to see the full list of 0 Ramda methods not implemented in Rambda and their status.
102
102
  </summary>
103
103
 
104
- - dropRepeatsBy
105
- - empty
106
- - eqBy
107
- - forEachObjIndexed
108
104
  - gt
109
105
  - gte
110
106
  - hasIn
@@ -226,7 +222,7 @@ There are methods which are benchmarked only with `Ramda` and `Rambda`(i.e. no `
226
222
 
227
223
  Note that some of these methods, are called with and without curring. This is done in order to give more detailed performance feedback.
228
224
 
229
- The benchmarks results are produced from latest versions of *Rambda*, *Lodash*(4.17.21) and *Ramda*(0.29.0).
225
+ The benchmarks results are produced from latest versions of *Rambda*, *Lodash*(4.17.21) and *Ramda*(0.29.1).
230
226
 
231
227
  </summary>
232
228
 
@@ -789,7 +785,7 @@ describe('R.any', () => {
789
785
 
790
786
  ```typescript
791
787
 
792
- anyPass<T, U extends T[]>(predicates: { [K in keyof U]: (x: T) => x is U[K]
788
+ anyPass<T>(predicates: ((x: T) => boolean)[]): (input: T) => boolean
793
789
  ```
794
790
 
795
791
  It accepts list of `predicates` and returns a function. This function with its `input` will return `true`, if any of `predicates` returns `true` for this `input`.
@@ -801,7 +797,6 @@ It accepts list of `predicates` and returns a function. This function with its `
801
797
  <summary>All TypeScript definitions</summary>
802
798
 
803
799
  ```typescript
804
- anyPass<T, U extends T[]>(predicates: { [K in keyof U]: (x: T) => x is U[K]; }): (input: T) => input is U[number];
805
800
  anyPass<T>(predicates: ((x: T) => boolean)[]): (input: T) => boolean;
806
801
  anyPass<T>(predicates: ((...inputs: T[]) => boolean)[]): (...inputs: T[]) => boolean;
807
802
  ```
@@ -930,18 +925,18 @@ describe('anyPass', () => {
930
925
  filtered2 // $ExpectType number[]
931
926
  })
932
927
  it('functions as a type guard', () => {
933
- const isString = (x: unknown): x is string => typeof x === 'string';
934
- const isNumber = (x: unknown): x is number => typeof x === 'number';
935
- const isBoolean = (x: unknown): x is boolean => typeof x === 'boolean';
936
-
937
- const isStringNumberOrBoolean = anyPass([isString, isNumber, isBoolean]);
928
+ const isString = (x: unknown): x is string => typeof x === 'string'
929
+ const isNumber = (x: unknown): x is number => typeof x === 'number'
930
+ const isBoolean = (x: unknown): x is boolean => typeof x === 'boolean'
931
+
932
+ const isStringNumberOrBoolean = anyPass([isString, isNumber, isBoolean])
938
933
 
939
- isStringNumberOrBoolean // $ExpectType (input: unknown) => input is string | number | boolean
934
+ isStringNumberOrBoolean // $ExpectType (input: unknown) => boolean
940
935
 
941
- const aValue: unknown = 1;
936
+ const aValue: unknown = 1
942
937
 
943
938
  if (isStringNumberOrBoolean(aValue)) {
944
- aValue // $ExpectType string | number | boolean
939
+ aValue // $ExpectType unknown
945
940
  }
946
941
  })
947
942
  })
@@ -3438,6 +3433,10 @@ describe('R.dropRepeats', () => {
3438
3433
 
3439
3434
  [![---------------](https://raw.githubusercontent.com/selfrefactor/rambda/master/files/separator.png)](#dropRepeats)
3440
3435
 
3436
+ ### dropRepeatsBy
3437
+
3438
+ [![---------------](https://raw.githubusercontent.com/selfrefactor/rambda/master/files/separator.png)](#dropRepeatsBy)
3439
+
3441
3440
  ### dropRepeatsWith
3442
3441
 
3443
3442
  <a title="redirect to Rambda Repl site" href="https://rambda.now.sh?const%20list%20%3D%20%5B%7Ba%3A1%2Cb%3A2%7D%2C%20%7Ba%3A1%2Cb%3A3%7D%2C%20%7Ba%3A2%2C%20b%3A4%7D%5D%0Aconst%20result%20%3D%20R.dropRepeatsWith(R.prop('a')%2C%20list)%0A%0A%2F%2F%20%3D%3E%20%5B%7Ba%3A1%2Cb%3A2%7D%2C%20%7Ba%3A2%2C%20b%3A4%7D%5D">Try this <strong>R.dropRepeatsWith</strong> example in Rambda REPL</a>
@@ -3603,6 +3602,10 @@ describe('R.either', () => {
3603
3602
 
3604
3603
  [![---------------](https://raw.githubusercontent.com/selfrefactor/rambda/master/files/separator.png)](#either)
3605
3604
 
3605
+ ### empty
3606
+
3607
+ [![---------------](https://raw.githubusercontent.com/selfrefactor/rambda/master/files/separator.png)](#empty)
3608
+
3606
3609
  ### endsWith
3607
3610
 
3608
3611
  ```typescript
@@ -3764,6 +3767,10 @@ describe('R.endsWith - string', () => {
3764
3767
 
3765
3768
  [![---------------](https://raw.githubusercontent.com/selfrefactor/rambda/master/files/separator.png)](#endsWith)
3766
3769
 
3770
+ ### eqBy
3771
+
3772
+ [![---------------](https://raw.githubusercontent.com/selfrefactor/rambda/master/files/separator.png)](#eqBy)
3773
+
3767
3774
  ### eqProps
3768
3775
 
3769
3776
  It returns `true` if property `prop` in `obj1` is equal to property `prop` in `obj2` according to `R.equals`.
@@ -5422,36 +5429,46 @@ forEach<T, U>(fn: ObjectIterator<T, void>): (list: Dictionary<T>) => Dictionary<
5422
5429
  import { isArray } from './_internals/isArray.js'
5423
5430
  import { keys } from './_internals/keys.js'
5424
5431
 
5425
- export function forEach(fn, list){
5426
- if (arguments.length === 1) return _list => forEach(fn, _list)
5432
+ export function forEachObjIndexedFn(fn, obj){
5433
+ let index = 0
5434
+ const listKeys = keys(obj)
5435
+ const len = listKeys.length
5427
5436
 
5428
- if (list === undefined){
5429
- return
5437
+ while (index < len){
5438
+ const key = listKeys[ index ]
5439
+ fn(
5440
+ obj[ key ], key, obj
5441
+ )
5442
+ index++
5430
5443
  }
5431
5444
 
5432
- if (isArray(list)){
5433
- let index = 0
5434
- const len = list.length
5445
+ return obj
5446
+ }
5435
5447
 
5436
- while (index < len){
5437
- fn(list[ index ])
5438
- index++
5439
- }
5440
- } else {
5448
+ export function forEachObjIndexed(fn, list){
5449
+ if (arguments.length === 1) return _list => forEachObjIndexed(fn, _list)
5450
+
5451
+ if (list === undefined) return
5452
+
5453
+ return forEachObjIndexedFn(fn, list)
5454
+ }
5455
+
5456
+ export function forEach(fn, iterable){
5457
+ if (arguments.length === 1) return _list => forEach(fn, _list)
5458
+
5459
+ if (iterable === undefined) return
5460
+
5461
+ if (isArray(iterable)){
5441
5462
  let index = 0
5442
- const listKeys = keys(list)
5443
- const len = listKeys.length
5463
+ const len = iterable.length
5444
5464
 
5445
5465
  while (index < len){
5446
- const key = listKeys[ index ]
5447
- fn(
5448
- list[ key ], key, list
5449
- )
5466
+ fn(iterable[ index ])
5450
5467
  index++
5451
5468
  }
5452
- }
5469
+ } else return forEachObjIndexedFn(fn, iterable)
5453
5470
 
5454
- return list
5471
+ return iterable
5455
5472
  }
5456
5473
  ```
5457
5474
 
@@ -5582,6 +5599,10 @@ describe('R.forEach with objects', () => {
5582
5599
 
5583
5600
  [![---------------](https://raw.githubusercontent.com/selfrefactor/rambda/master/files/separator.png)](#forEach)
5584
5601
 
5602
+ ### forEachObjIndexed
5603
+
5604
+ [![---------------](https://raw.githubusercontent.com/selfrefactor/rambda/master/files/separator.png)](#forEachObjIndexed)
5605
+
5585
5606
  ### fromPairs
5586
5607
 
5587
5608
  It transforms a `listOfPairs` to an object.
@@ -8780,7 +8801,7 @@ mergeWith<Output>(fn: (x: any, z: any) => any): <U, V>(a: U, b: V) => Output;
8780
8801
  ```javascript
8781
8802
  import { curry } from './curry.js'
8782
8803
 
8783
- function mergeWithFn(
8804
+ export function mergeWithFn(
8784
8805
  mergeFn, aInput, bInput
8785
8806
  ){
8786
8807
  const a = aInput ?? {}
@@ -8788,21 +8809,15 @@ function mergeWithFn(
8788
8809
  const willReturn = {}
8789
8810
 
8790
8811
  Object.keys(a).forEach(key => {
8791
- if (b[ key ] === undefined){
8792
- willReturn[ key ] = a[ key ]
8793
- } else {
8794
- willReturn[ key ] = mergeFn(a[ key ], b[ key ])
8795
- }
8812
+ if (b[ key ] === undefined) willReturn[ key ] = a[ key ]
8813
+ else willReturn[ key ] = mergeFn(a[ key ], b[ key ])
8796
8814
  })
8797
8815
 
8798
8816
  Object.keys(b).forEach(key => {
8799
8817
  if (willReturn[ key ] !== undefined) return
8800
8818
 
8801
- if (a[ key ] === undefined){
8802
- willReturn[ key ] = b[ key ]
8803
- } else {
8804
- willReturn[ key ] = mergeFn(a[ key ], b[ key ])
8805
- }
8819
+ if (a[ key ] === undefined) willReturn[ key ] = b[ key ]
8820
+ else willReturn[ key ] = mergeFn(a[ key ], b[ key ])
8806
8821
  })
8807
8822
 
8808
8823
  return willReturn
@@ -8819,10 +8834,10 @@ export const mergeWith = curry(mergeWithFn)
8819
8834
 
8820
8835
  ```javascript
8821
8836
  import { concat } from './concat.js'
8822
- import { mergeWith } from './mergeWith.js'
8837
+ import { mergeWithFn } from './mergeWith.js'
8823
8838
 
8824
8839
  test('happy', () => {
8825
- const result = mergeWith(
8840
+ const result = mergeWithFn(
8826
8841
  concat,
8827
8842
  {
8828
8843
  a : true,
@@ -8835,8 +8850,8 @@ test('happy', () => {
8835
8850
  )
8836
8851
  const expected = {
8837
8852
  a : true,
8838
- values : [ 10, 20, 15, 35 ],
8839
8853
  b : true,
8854
+ values : [ 10, 20, 15, 35 ],
8840
8855
  }
8841
8856
  expect(result).toEqual(expected)
8842
8857
  })
@@ -8844,31 +8859,31 @@ test('happy', () => {
8844
8859
  // https://github.com/ramda/ramda/pull/3222/files#diff-d925d9188b478d2f1d4b26012c6dddac374f9e9d7a336604d654b9a113bfc857
8845
8860
  describe('acts as if nil values are simply empty objects', () => {
8846
8861
  it('if the first object is nil and the second empty', () => {
8847
- expect(mergeWith(
8862
+ expect(mergeWithFn(
8848
8863
  concat, undefined, {}
8849
8864
  )).toEqual({})
8850
8865
  })
8851
8866
 
8852
8867
  it('if the first object is empty and the second nil', () => {
8853
- expect(mergeWith(
8868
+ expect(mergeWithFn(
8854
8869
  concat, {}, null
8855
8870
  )).toEqual({})
8856
8871
  })
8857
8872
 
8858
8873
  it('if both objects are nil', () => {
8859
- expect(mergeWith(
8874
+ expect(mergeWithFn(
8860
8875
  concat, undefined, null
8861
8876
  )).toEqual({})
8862
8877
  })
8863
8878
 
8864
8879
  it('if the first object is not empty and the second is nil', () => {
8865
- expect(mergeWith(
8880
+ expect(mergeWithFn(
8866
8881
  concat, { a : 'a' }, null
8867
8882
  )).toEqual({ a : 'a' })
8868
8883
  })
8869
8884
 
8870
8885
  it('if the first object is nil and the second is not empty', () => {
8871
- expect(mergeWith(
8886
+ expect(mergeWithFn(
8872
8887
  concat, undefined, { a : 'a' }
8873
8888
  )).toEqual({ a : 'a' })
8874
8889
  })
@@ -10073,18 +10088,7 @@ test('index lens', () => {
10073
10088
 
10074
10089
  ```typescript
10075
10090
 
10076
- partial<
10077
- Args extends unknown[],
10078
- ArgsGiven extends [...Partial<Args>],
10079
- R
10080
- >(
10081
- fn: (...args: Args) => R,
10082
- ...args: ArgsGiven
10083
- ): Args extends [...{[K in keyof ArgsGiven]: Args[K]}, ...infer ArgsRemaining]
10084
- ? ArgsRemaining extends []
10085
- ? R
10086
- : (...args: ArgsRemaining) => R
10087
- : never
10091
+ partial<V0, V1, T>(fn: (x0: V0, x1: V1) => T, args: [V0]): (x1: V1) => T
10088
10092
  ```
10089
10093
 
10090
10094
  It is very similar to `R.curry`, but you can pass initial arguments when you create the curried function.
@@ -10099,31 +10103,22 @@ The name comes from the fact that you partially inject the inputs.
10099
10103
  <summary>All TypeScript definitions</summary>
10100
10104
 
10101
10105
  ```typescript
10102
- partial<
10103
- Args extends unknown[],
10104
- ArgsGiven extends [...Partial<Args>],
10105
- R
10106
- >(
10107
- fn: (...args: Args) => R,
10108
- ...args: ArgsGiven
10109
- ): Args extends [...{[K in keyof ArgsGiven]: Args[K]}, ...infer ArgsRemaining]
10110
- ? ArgsRemaining extends []
10111
- ? R
10112
- : (...args: ArgsRemaining) => R
10113
- : never;
10114
-
10115
- partial<
10116
- Args extends readonly unknown[],
10117
- ArgsGiven extends [...Partial<Args>],
10118
- R
10119
- >(
10120
- fn: (...args: Args) => R,
10121
- args: ArgsGiven
10122
- ): Args extends [...{[K in keyof ArgsGiven]: Args[K]}, ...infer ArgsRemaining]
10123
- ? ArgsRemaining extends []
10124
- ? R
10125
- : (...args: ArgsRemaining) => R
10126
- : never;
10106
+ partial<V0, V1, T>(fn: (x0: V0, x1: V1) => T, args: [V0]): (x1: V1) => T;
10107
+ partial<V0, V1, V2, T>(fn: (x0: V0, x1: V1, x2: V2) => T, args: [V0, V1]): (x2: V2) => T;
10108
+ partial<V0, V1, V2, T>(fn: (x0: V0, x1: V1, x2: V2) => T, args: [V0]): (x1: V1, x2: V2) => T;
10109
+ partial<V0, V1, V2, V3, T>(
10110
+ fn: (x0: V0, x1: V1, x2: V2, x3: V3) => T,
10111
+ args: [V0, V1, V2],
10112
+ ): (x2: V3) => T;
10113
+ partial<V0, V1, V2, V3, T>(
10114
+ fn: (x0: V0, x1: V1, x2: V2, x3: V3) => T,
10115
+ args: [V0, V1],
10116
+ ): (x2: V2, x3: V3) => T;
10117
+ partial<V0, V1, V2, V3, T>(
10118
+ fn: (x0: V0, x1: V1, x2: V2, x3: V3) => T,
10119
+ args: [V0],
10120
+ ): (x1: V1, x2: V2, x3: V3) => T;
10121
+ partial<T>(fn: (...a: any[]) => T, args: any[]): (...a: any[]) => T;
10127
10122
  ```
10128
10123
 
10129
10124
  </details>
@@ -10240,44 +10235,20 @@ describe('R.partial', () => {
10240
10235
  aBoolean: boolean,
10241
10236
  aNull: null
10242
10237
  ) {
10243
- return { aString, aNumber, aBoolean, aNull }
10238
+ return {aString, aNumber, aBoolean, aNull}
10244
10239
  }
10245
10240
 
10246
10241
  // @ts-expect-error
10247
- partial(fn, 1);
10248
-
10249
- const fn1 = partial(fn, 'a')
10250
-
10251
- // @ts-expect-error
10252
- partial(fn1, 'b');
10253
-
10254
- const fn2 = partial(fn1, 2)
10255
- const result = fn2(true, null)
10256
- result // $ExpectType { aString: string; aNumber: number; aBoolean: boolean; aNull: null; }
10257
- })
10258
-
10259
- it('ramda', () => {
10260
- function fn(
10261
- aString: string,
10262
- aNumber: number,
10263
- aBoolean: boolean,
10264
- aNull: null
10265
- ) {
10266
- return { aString, aNumber, aBoolean, aNull }
10267
- }
10268
-
10269
- // @ts-expect-error
10270
- partial(fn, 1);
10242
+ partial(fn, 1)
10271
10243
 
10272
10244
  const fn1 = partial(fn, ['a'])
10273
-
10274
- // @ts-expect-error
10275
- partial(fn1, ['b']);
10245
+ partial(fn1, ['b'])
10276
10246
 
10277
10247
  const fn2 = partial(fn1, [2])
10278
10248
  const result = fn2(true, null)
10279
10249
  result // $ExpectType { aString: string; aNumber: number; aBoolean: boolean; aNull: null; }
10280
- })})
10250
+ })
10251
+ })
10281
10252
  ```
10282
10253
 
10283
10254
  </details>
@@ -17452,6 +17423,28 @@ describe('R.zipWith', () => {
17452
17423
 
17453
17424
  ## ❯ CHANGELOG
17454
17425
 
17426
+ 8.6.0
17427
+
17428
+ - Wrong typing for `R.dissocPath` - [Issue #709](https://github.com/selfrefactor/rambda/issues/709)
17429
+
17430
+ - Add `R.sortWith` - [Issue #7097](https://github.com/selfrefactor/rambda/issues/707)
17431
+
17432
+ - Update build dependencies
17433
+
17434
+ 8.5.0
17435
+
17436
+ - Revert changes in `R.anyPass` introduced in `8.4.0` release. The reason is that the change was breaking the library older than `5.2.0` TypeScript.
17437
+
17438
+ - Wrong `R.partial` TS definition - [Issue #705](https://github.com/selfrefactor/rambda/issues/705)
17439
+
17440
+ - Add `R.dropRepeatsBy`
17441
+
17442
+ - Add `R.empty`
17443
+
17444
+ - Add `R.eqBy`
17445
+
17446
+ - Add `R.forEachObjIndexed`
17447
+
17455
17448
  8.4.0
17456
17449
 
17457
17450
  - Add `R.dissocPath`
@@ -17784,25 +17777,25 @@ Fix wrong versions in changelog
17784
17777
 
17785
17778
  > Most influential contributors(in alphabetical order)
17786
17779
 
17787
- - [@farwayer](https://github.com/farwayer) - improving performance in R.find, R.filter; give the idea how to make benchmarks more reliable;
17780
+ - ![farwayer avatar](https://avatars.githubusercontent.com/farwayer) [@farwayer](https://github.com/farwayer) - improving performance in R.find, R.filter; give the idea how to make benchmarks more reliable;
17788
17781
 
17789
- - [@thejohnfreeman](https://github.com/thejohnfreeman) - add R.assoc, R.chain;
17782
+ - ![thejohnfreeman avatar](https://avatars.githubusercontent.com/thejohnfreeman) [@thejohnfreeman](https://github.com/thejohnfreeman) - add R.assoc, R.chain;
17790
17783
 
17791
- - [@peeja](https://github.com/peeja) - add several methods and fix mutiple issues; provides great MR documentation
17784
+ - ![peeja avatar](https://avatars.githubusercontent.com/peeja) [@peeja](https://github.com/peeja) - add several methods and fix mutiple issues; provides great MR documentation
17792
17785
 
17793
- - [@helmuthdu](https://github.com/helmuthdu) - add R.clone; help improve code style;
17786
+ - ![helmuthdu avatar](https://avatars.githubusercontent.com/helmuthdu) [@helmuthdu](https://github.com/helmuthdu) - add R.clone; help improve code style;
17794
17787
 
17795
- - [@jpgorman](https://github.com/jpgorman) - add R.zip, R.reject, R.without, R.addIndex;
17788
+ - ![jpgorman avatar](https://avatars.githubusercontent.com/jpgorman) [@jpgorman](https://github.com/jpgorman) - add R.zip, R.reject, R.without, R.addIndex;
17796
17789
 
17797
- - [@ku8ar](https://github.com/ku8ar) - add R.slice, R.propOr, R.identical, R.propIs and several math related methods; introduce the idea to display missing Ramda methods;
17790
+ - ![ku8ar avatar](https://avatars.githubusercontent.com/ku8ar) [@ku8ar](https://github.com/ku8ar) - add R.slice, R.propOr, R.identical, R.propIs and several math related methods; introduce the idea to display missing Ramda methods;
17798
17791
 
17799
- - [@romgrk](https://github.com/romgrk) - add R.groupBy, R.indexBy, R.findLast, R.findLastIndex;
17792
+ - ![romgrk avatar](https://avatars.githubusercontent.com/romgrk) [@romgrk](https://github.com/romgrk) - add R.groupBy, R.indexBy, R.findLast, R.findLastIndex;
17800
17793
 
17801
- - [@squidfunk](https://github.com/squidfunk) - add R.assocPath, R.symmetricDifference, R.difference, R.intersperse;
17794
+ - ![squidfunk avatar](https://avatars.githubusercontent.com/squidfunk) [@squidfunk](https://github.com/squidfunk) - add R.assocPath, R.symmetricDifference, R.difference, R.intersperse;
17802
17795
 
17803
- - [@synthet1c](https://github.com/synthet1c) - add all lenses methods; add R.applySpec, R.converge;
17796
+ - ![synthet1c avatar](https://avatars.githubusercontent.com/synthet1c) [@synthet1c](https://github.com/synthet1c) - add all lenses methods; add R.applySpec, R.converge;
17804
17797
 
17805
- - [@vlad-zhukov](https://github.com/vlad-zhukov) - help with configuring Rollup, Babel; change export file to use ES module exports;
17798
+ - ![vlad-zhukov avatar](https://avatars.githubusercontent.com/vlad-zhukov) [@vlad-zhukov](https://github.com/vlad-zhukov) - help with configuring Rollup, Babel; change export file to use ES module exports;
17806
17799
 
17807
17800
  > Rambda references
17808
17801
 
@@ -17814,20 +17807,16 @@ Fix wrong versions in changelog
17814
17807
 
17815
17808
  > Links to Rambda
17816
17809
 
17817
- - [https://mailchi.mp/webtoolsweekly/web-tools-280](Web Tools Weekly)
17818
-
17819
17810
  - [https://github.com/stoeffel/awesome-fp-js](awesome-fp-js)
17820
17811
 
17812
+ - [ https://mailchi.mp/webtoolsweekly/web-tools-280 ]( Web Tools Weekly #280 )
17813
+
17821
17814
  - [https://github.com/docsifyjs/awesome-docsify](awesome-docsify)
17822
17815
 
17823
17816
  > Deprecated from `Used by` section
17824
17817
 
17825
17818
  - [SAP's Cloud SDK](https://github.com/SAP/cloud-sdk) - This repo doesn't uses `Rambda` since *October/2020* [commit that removes Rambda](https://github.com/SAP/cloud-sdk/commit/b29b4f915c4e4e9c2441e7b6b67cf83dac1fdac3)
17826
17819
 
17827
- > Releases
17828
-
17829
- [Rambda's releases](https://github.com/selfrefactor/rambda/releases) before **6.4.0** were used mostly for testing purposes.
17830
-
17831
17820
  [![---------------](https://raw.githubusercontent.com/selfrefactor/rambda/master/files/separator.png)](#-additional-info)
17832
17821
 
17833
17822
  ## My other libraries