rambda 6.9.0 → 7.0.3

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.
Files changed (188) hide show
  1. package/CHANGELOG.md +87 -1
  2. package/README.md +3827 -4905
  3. package/dist/rambda.esm.js +301 -208
  4. package/dist/rambda.js +306 -209
  5. package/dist/rambda.mjs +303 -210
  6. package/dist/rambda.umd.js +1 -1
  7. package/immutable.d.ts +207 -285
  8. package/index.d.ts +198 -276
  9. package/package.json +119 -98
  10. package/src/F.js +1 -1
  11. package/src/T.js +1 -1
  12. package/src/_internals/_isInteger.js +1 -1
  13. package/src/_internals/_objectIs.js +2 -2
  14. package/src/_internals/baseSlice.js +6 -8
  15. package/src/_internals/cloneList.js +3 -0
  16. package/src/_internals/isFalsy.js +5 -5
  17. package/src/_internals/isObject.js +3 -3
  18. package/src/_internals/isTruthy.js +5 -5
  19. package/src/_internals/set.js +4 -4
  20. package/src/add.js +1 -1
  21. package/src/adjust.js +5 -6
  22. package/src/all.js +3 -3
  23. package/src/allPass.js +4 -4
  24. package/src/always.js +1 -1
  25. package/src/and.js +1 -1
  26. package/src/any.js +3 -3
  27. package/src/anyPass.js +4 -4
  28. package/src/append.js +4 -2
  29. package/src/apply.js +7 -0
  30. package/src/applySpec.js +33 -59
  31. package/src/assoc.js +3 -7
  32. package/src/assocPath.js +22 -25
  33. package/src/bind.js +9 -0
  34. package/src/both.js +1 -1
  35. package/src/chain.js +2 -2
  36. package/src/clamp.js +6 -6
  37. package/src/clone.js +10 -10
  38. package/src/complement.js +1 -1
  39. package/src/compose.js +6 -6
  40. package/src/concat.js +2 -2
  41. package/src/cond.js +3 -3
  42. package/src/converge.js +11 -11
  43. package/src/curry.js +2 -2
  44. package/src/curryN.js +61 -81
  45. package/src/defaultTo.js +5 -8
  46. package/src/difference.js +3 -3
  47. package/src/dissoc.js +4 -4
  48. package/src/divide.js +1 -1
  49. package/src/drop.js +1 -1
  50. package/src/dropLast.js +5 -5
  51. package/src/dropLastWhile.js +12 -12
  52. package/src/dropRepeats.js +6 -6
  53. package/src/dropRepeatsWith.js +7 -7
  54. package/src/dropWhile.js +9 -9
  55. package/src/either.js +2 -2
  56. package/src/endsWith.js +20 -3
  57. package/src/eqProps.js +5 -10
  58. package/src/equals.js +119 -38
  59. package/src/evolve.js +23 -21
  60. package/src/filter.js +18 -18
  61. package/src/find.js +4 -4
  62. package/src/findIndex.js +3 -3
  63. package/src/findLast.js +4 -4
  64. package/src/findLastIndex.js +3 -3
  65. package/src/flatten.js +6 -6
  66. package/src/flip.js +11 -15
  67. package/src/forEach.js +10 -12
  68. package/src/fromPairs.js +2 -2
  69. package/src/groupBy.js +6 -6
  70. package/src/groupWith.js +11 -12
  71. package/src/hasPath.js +5 -5
  72. package/src/head.js +3 -3
  73. package/src/identical.js +1 -1
  74. package/src/identity.js +2 -2
  75. package/src/ifElse.js +3 -5
  76. package/src/includes.js +11 -10
  77. package/src/indexBy.js +11 -11
  78. package/src/indexOf.js +3 -25
  79. package/src/init.js +2 -4
  80. package/src/intersection.js +3 -3
  81. package/src/intersperse.js +5 -5
  82. package/src/is.js +2 -2
  83. package/src/isEmpty.js +5 -5
  84. package/src/isFunction.js +3 -3
  85. package/src/isNil.js +1 -1
  86. package/src/isPromise.js +3 -3
  87. package/src/join.js +1 -1
  88. package/src/keys.js +1 -1
  89. package/src/last.js +4 -4
  90. package/src/lastIndexOf.js +5 -11
  91. package/src/length.js +6 -5
  92. package/src/lens.js +3 -3
  93. package/src/lensIndex.js +4 -4
  94. package/src/lensProp.js +4 -4
  95. package/src/map.js +17 -18
  96. package/src/match.js +1 -1
  97. package/src/mathMod.js +2 -2
  98. package/src/max.js +1 -1
  99. package/src/maxBy.js +2 -4
  100. package/src/maybe.js +2 -4
  101. package/src/mean.js +2 -2
  102. package/src/median.js +12 -10
  103. package/src/merge.js +2 -4
  104. package/src/mergeAll.js +3 -3
  105. package/src/mergeDeepRight.js +8 -8
  106. package/src/mergeLeft.js +2 -2
  107. package/src/min.js +1 -1
  108. package/src/minBy.js +2 -4
  109. package/src/modulo.js +1 -1
  110. package/src/move.js +7 -8
  111. package/src/multiply.js +1 -1
  112. package/src/negate.js +1 -1
  113. package/src/none.js +4 -4
  114. package/src/not.js +1 -1
  115. package/src/nth.js +4 -4
  116. package/src/objOf.js +3 -3
  117. package/src/of.js +2 -2
  118. package/src/omit.js +5 -5
  119. package/src/once.js +6 -6
  120. package/src/or.js +1 -1
  121. package/src/over.js +3 -5
  122. package/src/partial.js +3 -3
  123. package/src/partition.js +17 -15
  124. package/src/path.js +6 -6
  125. package/src/pathEq.js +4 -6
  126. package/src/pathOr.js +5 -7
  127. package/src/paths.js +3 -3
  128. package/src/pick.js +5 -5
  129. package/src/pickAll.js +6 -6
  130. package/src/pipe.js +3 -3
  131. package/src/pluck.js +4 -4
  132. package/src/prepend.js +3 -3
  133. package/src/product.js +2 -2
  134. package/src/prop.js +2 -2
  135. package/src/propEq.js +3 -5
  136. package/src/propIs.js +4 -6
  137. package/src/propOr.js +4 -6
  138. package/src/props.js +6 -6
  139. package/src/range.js +4 -4
  140. package/src/reduce.js +7 -11
  141. package/src/reject.js +2 -2
  142. package/src/repeat.js +2 -2
  143. package/src/replace.js +2 -4
  144. package/src/reverse.js +3 -4
  145. package/src/set.js +5 -9
  146. package/src/slice.js +2 -4
  147. package/src/sort.js +4 -4
  148. package/src/sortBy.js +4 -2
  149. package/src/split.js +1 -1
  150. package/src/splitAt.js +9 -9
  151. package/src/splitEvery.js +8 -6
  152. package/src/splitWhen.js +10 -10
  153. package/src/startsWith.js +20 -3
  154. package/src/subtract.js +1 -1
  155. package/src/sum.js +1 -1
  156. package/src/symmetricDifference.js +9 -7
  157. package/src/tail.js +2 -2
  158. package/src/take.js +2 -4
  159. package/src/takeLast.js +2 -4
  160. package/src/takeLastWhile.js +7 -7
  161. package/src/takeWhile.js +8 -8
  162. package/src/tap.js +1 -1
  163. package/src/test.js +5 -3
  164. package/src/times.js +4 -4
  165. package/src/toLower.js +1 -1
  166. package/src/toPairs.js +1 -1
  167. package/src/toString.js +1 -1
  168. package/src/toUpper.js +1 -1
  169. package/src/transpose.js +4 -3
  170. package/src/trim.js +1 -1
  171. package/src/tryCatch.js +5 -5
  172. package/src/type.js +7 -29
  173. package/src/unapply.js +5 -0
  174. package/src/union.js +4 -3
  175. package/src/uniq.js +2 -2
  176. package/src/uniqWith.js +18 -7
  177. package/src/unless.js +3 -3
  178. package/src/update.js +6 -8
  179. package/src/values.js +2 -2
  180. package/src/view.js +2 -2
  181. package/src/when.js +2 -4
  182. package/src/where.js +5 -5
  183. package/src/whereEq.js +9 -7
  184. package/src/without.js +1 -1
  185. package/src/xor.js +2 -2
  186. package/src/zip.js +3 -3
  187. package/src/zipObj.js +4 -6
  188. package/src/zipWith.js +6 -7
package/immutable.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export type RambdaTypes = "Object" | "Number" | "Boolean" | "String" | "Null" | "Array" | "RegExp" | "NaN" | "Function" | "Undefined" | "Async" | "Promise" | "Symbol";
1
+ export type RambdaTypes = "Object" | "Number" | "Boolean" | "String" | "Null" | "Array" | "RegExp" | "NaN" | "Function" | "Undefined" | "Async" | "Promise" | "Symbol" | "Set" | "Error";
2
2
 
3
3
  export type IndexedIterator<T, U> = (x: T, i: number) => U;
4
4
  export type Iterator<T, U> = (x: T) => U;
@@ -9,6 +9,7 @@ type Predicate<T> = (x: T) => boolean;
9
9
  export type IndexedPredicate<T> = (x: T, i: number) => boolean;
10
10
  export type ObjectPredicate<T> = (x: T, prop: string, inputObj: Dictionary<T>) => boolean;
11
11
  export type RamdaPath = readonly (number | string)[];
12
+ type CondPair<T extends readonly any[], R> = readonly [(...val: T) => boolean, (...val: T) => R]
12
13
 
13
14
  type ValueOfRecord<R> =
14
15
  R extends Record<any, infer T>
@@ -155,7 +156,7 @@ export function allPass<T>(predicates: readonly ((x: T) => boolean)[]): (input:
155
156
  /**
156
157
  * It returns function that always returns `x`.
157
158
  */
158
- export function always<T>(x: T): () => T;
159
+ export function always<T>(x: T): (...args: readonly unknown[]) => T;
159
160
 
160
161
  /**
161
162
  * Logical AND
@@ -196,8 +197,8 @@ export function applySpec<T>(spec: any): (...args: readonly any[]) => T;
196
197
  /**
197
198
  * It makes a shallow clone of `obj` with setting or overriding the property `prop` with `newValue`.
198
199
  */
199
- export function assoc<T, U, K extends string>(prop: K, val: T, obj: U): Record<K, T> & U;
200
- export function assoc<T, K extends string>(prop: K, val: T): <U>(obj: U) => Record<K, T> & U;
200
+ export function assoc<T, U, K extends string>(prop: K, val: T, obj: U): Record<K, T> & Omit<U, K>;
201
+ export function assoc<T, K extends string>(prop: K, val: T): <U>(obj: U) => Record<K, T> & Omit<U, K>;
201
202
  export function assoc<K extends string>(prop: K): AssocPartialOne<K>;
202
203
 
203
204
  /**
@@ -222,7 +223,6 @@ export function both(pred1: Pred): (pred2: Pred) => Pred;
222
223
  */
223
224
  export function chain<T, U>(fn: (n: T) => readonly U[], list: readonly T[]): readonly U[];
224
225
  export function chain<T, U>(fn: (n: T) => readonly U[]): (list: readonly T[]) => readonly U[];
225
- export function chain<X0, X1, R>(fn: (x0: X0, x1: X1) => R, fn1: (x1: X1) => X0): (x1: X1) => R;
226
226
 
227
227
  /**
228
228
  * Restrict a number `input` to be within `min` and `max` limits.
@@ -245,52 +245,75 @@ export function clone<T>(input: readonly T[]): readonly T[];
245
245
  *
246
246
  * The return value of `inverted` is the negative boolean value of `origin(input)`.
247
247
  */
248
- export function complement<T extends readonly any[]>(pred: (...args: T) => boolean): (...args: T) => boolean;
248
+ export function complement<T extends readonly any[]>(predicate: (...args: T) => unknown): (...args: T) => boolean;
249
249
 
250
250
  /**
251
251
  * It performs right-to-left function composition.
252
252
  */
253
- export function compose<T1>(fn0: () => T1): () => T1;
254
- export function compose<V0, T1>(fn0: (x0: V0) => T1): (x0: V0) => T1;
255
- export function compose<V0, V1, T1>(fn0: (x0: V0, x1: V1) => T1): (x0: V0, x1: V1) => T1;
256
- export function compose<V0, V1, V2, T1>(fn0: (x0: V0, x1: V1, x2: V2) => T1): (x0: V0, x1: V1, x2: V2) => T1;
257
-
258
- export function compose<T1, T2>(fn1: (x: T1) => T2, fn0: () => T1): () => T2;
259
- export function compose<V0, T1, T2>(fn1: (x: T1) => T2, fn0: (x0: V0) => T1): (x0: V0) => T2;
260
- export function compose<V0, V1, T1, T2>(fn1: (x: T1) => T2, fn0: (x0: V0, x1: V1) => T1): (x0: V0, x1: V1) => T2;
261
- export function compose<V0, V1, V2, T1, T2>(fn1: (x: T1) => T2, fn0: (x0: V0, x1: V1, x2: V2) => T1): (x0: V0, x1: V1, x2: V2) => T2;
262
-
263
- export function compose<T1, T2, T3>(fn2: (x: T2) => T3, fn1: (x: T1) => T2, fn0: () => T1): () => T3;
264
- export function compose<V0, T1, T2, T3>(fn2: (x: T2) => T3, fn1: (x: T1) => T2, fn0: (x: V0) => T1): (x: V0) => T3;
265
- export function compose<V0, V1, T1, T2, T3>(fn2: (x: T2) => T3, fn1: (x: T1) => T2, fn0: (x0: V0, x1: V1) => T1): (x0: V0, x1: V1) => T3;
266
- export function compose<V0, V1, V2, T1, T2, T3>(fn2: (x: T2) => T3, fn1: (x: T1) => T2, fn0: (x0: V0, x1: V1, x2: V2) => T1): (x0: V0, x1: V1, x2: V2) => T3;
267
-
268
- export function compose<T1, T2, T3, T4>(fn3: (x: T3) => T4, fn2: (x: T2) => T3, fn1: (x: T1) => T2, fn0: () => T1): () => T4;
269
- export function compose<V0, T1, T2, T3, T4>(fn3: (x: T3) => T4, fn2: (x: T2) => T3, fn1: (x: T1) => T2, fn0: (x: V0) => T1): (x: V0) => T4;
270
- export function compose<V0, V1, T1, T2, T3, T4>(fn3: (x: T3) => T4, fn2: (x: T2) => T3, fn1: (x: T1) => T2, fn0: (x0: V0, x1: V1) => T1): (x0: V0, x1: V1) => T4;
271
- export function compose<V0, V1, V2, T1, T2, T3, T4>(fn3: (x: T3) => T4, fn2: (x: T2) => T3, fn1: (x: T1) => T2, fn0: (x0: V0, x1: V1, x2: V2) => T1): (x0: V0, x1: V1, x2: V2) => T4;
272
-
273
- export function compose<T1, T2, T3, T4, T5>(fn4: (x: T4) => T5, fn3: (x: T3) => T4, fn2: (x: T2) => T3, fn1: (x: T1) => T2, fn0: () => T1): () => T5;
274
- export function compose<V0, T1, T2, T3, T4, T5>(fn4: (x: T4) => T5, fn3: (x: T3) => T4, fn2: (x: T2) => T3, fn1: (x: T1) => T2, fn0: (x: V0) => T1): (x: V0) => T5;
275
- export function compose<V0, V1, T1, T2, T3, T4, T5>(fn4: (x: T4) => T5, fn3: (x: T3) => T4, fn2: (x: T2) => T3, fn1: (x: T1) => T2, fn0: (x0: V0, x1: V1) => T1): (x0: V0, x1: V1) => T5;
276
- export function compose<V0, V1, V2, T1, T2, T3, T4, T5>(fn4: (x: T4) => T5, fn3: (x: T3) => T4, fn2: (x: T2) => T3, fn1: (x: T1) => T2, fn0: (x0: V0, x1: V1, x2: V2) => T1): (x0: V0, x1: V1, x2: V2) => T5;
277
-
278
- export function compose<T1, T2, T3, T4, T5, T6>(fn5: (x: T5) => T6, fn4: (x: T4) => T5, fn3: (x: T3) => T4, fn2: (x: T2) => T3, fn1: (x: T1) => T2, fn0: () => T1): () => T6;
279
- export function compose<V0, T1, T2, T3, T4, T5, T6>(fn5: (x: T5) => T6, fn4: (x: T4) => T5, fn3: (x: T3) => T4, fn2: (x: T2) => T3, fn1: (x: T1) => T2, fn0: (x: V0) => T1): (x: V0) => T6;
280
- export function compose<V0, V1, T1, T2, T3, T4, T5, T6>(
281
- fn5: (x: T5) => T6,
282
- fn4: (x: T4) => T5,
283
- fn3: (x: T3) => T4,
284
- fn2: (x: T2) => T3,
285
- fn1: (x: T1) => T2,
286
- fn0: (x0: V0, x1: V1) => T1): (x0: V0, x1: V1) => T6;
287
- export function compose<V0, V1, V2, T1, T2, T3, T4, T5, T6>(
288
- fn5: (x: T5) => T6,
289
- fn4: (x: T4) => T5,
290
- fn3: (x: T3) => T4,
291
- fn2: (x: T2) => T3,
292
- fn1: (x: T1) => T2,
293
- fn0: (x0: V0, x1: V1, x2: V2) => T1): (x0: V0, x1: V1, x2: V2) => T6;
253
+ export function compose<TArgs extends readonly any[], R1, R2, R3, R4, R5, R6, R7, TResult>(
254
+ ...func: readonly [
255
+ fnLast: (a: any) => TResult,
256
+ ...func: ReadonlyArray<(a: any) => any>,
257
+ f7: (a: R6) => R7,
258
+ f6: (a: R5) => R6,
259
+ f5: (a: R4) => R5,
260
+ f4: (a: R3) => R4,
261
+ f3: (a: R2) => R3,
262
+ f2: (a: R1) => R2,
263
+ f1: (...args: TArgs) => R1
264
+ ]
265
+ ): (...args: TArgs) => TResult; // fallback overload if number of composed functions greater than 7
266
+ export function compose<TArgs extends readonly any[], R1, R2, R3, R4, R5, R6, R7, TResult>(
267
+ f7: (a: R6) => R7,
268
+ f6: (a: R5) => R6,
269
+ f5: (a: R4) => R5,
270
+ f4: (a: R3) => R4,
271
+ f3: (a: R2) => R3,
272
+ f2: (a: R1) => R2,
273
+ f1: (...args: TArgs) => R1
274
+ ): (...args: TArgs) => R7;
275
+ export function compose<TArgs extends readonly any[], R1, R2, R3, R4, R5, R6, R7>(
276
+ f7: (a: R6) => R7,
277
+ f6: (a: R5) => R6,
278
+ f5: (a: R4) => R5,
279
+ f4: (a: R3) => R4,
280
+ f3: (a: R2) => R3,
281
+ f2: (a: R1) => R2,
282
+ f1: (...args: TArgs) => R1
283
+ ): (...args: TArgs) => R7;
284
+ export function compose<TArgs extends readonly any[], R1, R2, R3, R4, R5, R6>(
285
+ f6: (a: R5) => R6,
286
+ f5: (a: R4) => R5,
287
+ f4: (a: R3) => R4,
288
+ f3: (a: R2) => R3,
289
+ f2: (a: R1) => R2,
290
+ f1: (...args: TArgs) => R1
291
+ ): (...args: TArgs) => R6;
292
+ export function compose<TArgs extends readonly any[], R1, R2, R3, R4, R5>(
293
+ f5: (a: R4) => R5,
294
+ f4: (a: R3) => R4,
295
+ f3: (a: R2) => R3,
296
+ f2: (a: R1) => R2,
297
+ f1: (...args: TArgs) => R1
298
+ ): (...args: TArgs) => R5;
299
+ export function compose<TArgs extends readonly any[], R1, R2, R3, R4>(
300
+ f4: (a: R3) => R4,
301
+ f3: (a: R2) => R3,
302
+ f2: (a: R1) => R2,
303
+ f1: (...args: TArgs) => R1
304
+ ): (...args: TArgs) => R4;
305
+ export function compose<TArgs extends readonly any[], R1, R2, R3>(
306
+ f3: (a: R2) => R3,
307
+ f2: (a: R1) => R2,
308
+ f1: (...args: TArgs) => R1
309
+ ): (...args: TArgs) => R3;
310
+ export function compose<TArgs extends readonly any[], R1, R2>(
311
+ f2: (a: R1) => R2,
312
+ f1: (...args: TArgs) => R1
313
+ ): (...args: TArgs) => R2;
314
+ export function compose<TArgs extends readonly any[], R1>(
315
+ f1: (...args: TArgs) => R1
316
+ ): (...args: TArgs) => R1;
294
317
 
295
318
  /**
296
319
  * It returns a new string or array, which is the result of merging `x` and `y`.
@@ -309,8 +332,7 @@ export function concat(x: string): (y: string) => string;
309
332
  *
310
333
  * If no winner is found, then `fn` returns `undefined`.
311
334
  */
312
- export function cond(conditions: readonly (readonly [Pred, (...a: readonly any[]) => any])[]): (...x: readonly any[]) => any;
313
- export function cond<A, B>(conditions: readonly (readonly [SafePred<A>, (...a: readonly A[]) => B])[]): (...x: readonly A[]) => B;
335
+ export function cond<T extends readonly any[], R>(conditions: ReadonlyArray<CondPair<T, R>>): (...args: T) => R;
314
336
 
315
337
  /**
316
338
  * Accepts a converging function and a list of branching functions and returns a new function. When invoked, this new function is applied to some arguments, each branching function is applied to those same arguments. The results of each branching function are passed as arguments to the converging function to produce the return value.
@@ -351,8 +373,8 @@ export function difference<T>(a: readonly T[]): (b: readonly T[]) => readonly T[
351
373
  /**
352
374
  * It returns a new object that does not contain property `prop`.
353
375
  */
354
- export function dissoc<T>(prop: string, obj: any): T;
355
- export function dissoc<T>(prop: string): (obj: any) => T;
376
+ export function dissoc<T extends object, K extends keyof T>(prop: K, obj: T): Omit<T, K>;
377
+ export function dissoc<K extends string | number>(prop: K): <T extends object>(obj: T) => Omit<T, K>;
356
378
 
357
379
  export function divide(x: number, y: number): number;
358
380
  export function divide(x: number): (y: number) => number;
@@ -388,10 +410,13 @@ export function either<T>(firstPredicate: Predicate<T>): (secondPredicate: Predi
388
410
  export function either(firstPredicate: Pred): (secondPredicate: Pred) => Pred;
389
411
 
390
412
  /**
391
- * Curried version of `String.prototype.endsWith`
413
+ * When iterable is a string, then it behaves as `String.prototype.endsWith`.
414
+ * When iterable is a list, then it uses R.equals to determine if the target list ends in the same way as the given target.
392
415
  */
393
- export function endsWith(target: string, str: string): boolean;
394
- export function endsWith(target: string): (str: string) => boolean;
416
+ export function endsWith(target: string, iterable: string): boolean;
417
+ export function endsWith(target: string): (iterable: string) => boolean;
418
+ export function endsWith<T>(target: readonly T[], list: readonly T[]): boolean;
419
+ export function endsWith<T>(target: readonly T[]): (list: readonly T[]) => boolean;
395
420
 
396
421
  /**
397
422
  * It deeply compares `x` and `y` and returns `true` if they are equal.
@@ -462,20 +487,22 @@ export function forEach<T, U>(fn: ObjectIterator<T, void>): (list: Dictionary<T>
462
487
  /**
463
488
  * It transforms a `listOfPairs` to an object.
464
489
  */
465
- export function fromPairs<V>(listOfPairs: readonly (readonly [number, V])[]): { readonly [index: number]: V };
466
- export function fromPairs<V>(listOfPairs: readonly (readonly [string, V])[]): { readonly [index: string]: V };
490
+ export function fromPairs<V>(listOfPairs: readonly ((readonly [number, V]))[]): { readonly [index: number]: V };
491
+ export function fromPairs<V>(listOfPairs: readonly ((readonly [string, V]))[]): { readonly [index: string]: V };
467
492
 
468
493
  /**
469
494
  * It splits `list` according to a provided `groupFn` function and returns an object.
470
495
  */
471
496
  export function groupBy<T>(groupFn: (x: T) => string, list: readonly T[]): { readonly [index: string]: readonly T[] };
472
497
  export function groupBy<T>(groupFn: (x: T) => string): (list: readonly T[]) => { readonly [index: string]: readonly T[] };
498
+ export function groupBy<T, U>(groupFn: (x: T) => string, list: readonly T[]): U;
499
+ export function groupBy<T, U>(groupFn: (x: T) => string): (list: readonly T[]) => U;
473
500
 
474
501
  /**
475
502
  * It returns separated version of list or string `input`, where separation is done with equality `compareFn` function.
476
503
  */
477
- export function groupWith<T>(compareFn: (x: T, y: T) => boolean): (input: readonly T[]) => readonly (readonly T[])[];
478
- export function groupWith<T>(compareFn: (x: T, y: T) => boolean, input: readonly T[]): readonly (readonly T[])[];
504
+ export function groupWith<T>(compareFn: (x: T, y: T) => boolean): (input: readonly T[]) => readonly ((readonly T[]))[];
505
+ export function groupWith<T>(compareFn: (x: T, y: T) => boolean, input: readonly T[]): readonly ((readonly T[]))[];
479
506
  export function groupWith<T>(compareFn: (x: T, y: T) => boolean, input: string): readonly string[];
480
507
 
481
508
  /**
@@ -498,8 +525,9 @@ export function hasPath<T>(
498
525
  /**
499
526
  * It returns the first element of list or string `input`.
500
527
  */
501
- export function head<T>(input: readonly T[]): T | undefined;
502
528
  export function head(input: string): string;
529
+ export function head(emptyList: readonly []): undefined;
530
+ export function head<T>(input: readonly T[]): T | undefined;
503
531
 
504
532
  /**
505
533
  * It returns `true` if its arguments `a` and `b` are identical.
@@ -519,16 +547,7 @@ export function identity<T>(input: T): T;
519
547
  *
520
548
  * When `fn`` is called with `input` argument, it will return either `onTrue(input)` or `onFalse(input)` depending on `condition(input)` evaluation.
521
549
  */
522
- export function ifElse<T, U>(
523
- condition: (x: T) => boolean,
524
- onTrue: (x: T) => U,
525
- onFalse: (x: T) => U,
526
- ): (x: T) => U;
527
- export function ifElse<T, K, U>(
528
- condition: (x: T, y: K) => boolean,
529
- onTrue: (x: T, y: K) => U,
530
- onFalse: (x: T, y: K) => U,
531
- ): (x: T, y: K) => U;
550
+ export function ifElse<TArgs extends readonly any[], TOnTrueResult, TOnFalseResult>(fn: (...args: TArgs) => boolean, onTrue: (...args: TArgs) => TOnTrueResult, onFalse: (...args: TArgs) => TOnFalseResult): (...args: TArgs) => TOnTrueResult | TOnFalseResult;
532
551
 
533
552
  /**
534
553
  * It increments a number.
@@ -588,8 +607,10 @@ export function intersperse<T>(separator: T): (list: readonly T[]) => readonly T
588
607
  /**
589
608
  * It returns `true` if `x` is instance of `targetPrototype`.
590
609
  */
591
- export function is(targetPrototype: any, x: any): boolean;
592
- export function is(targetPrototype: any): (x: any) => boolean;
610
+ export function is<C extends () => any>(targetPrototype: C, val: any): val is ReturnType<C>;
611
+ export function is<C extends new () => any>(targetPrototype: C, val: any): val is InstanceType<C>;
612
+ export function is<C extends () => any>(targetPrototype: C): (val: any) => val is ReturnType<C>;
613
+ export function is<C extends new () => any>(targetPrototype: C): (val: any) => val is InstanceType<C>;
593
614
 
594
615
  /**
595
616
  * It returns `true` if `x` is `empty`.
@@ -618,7 +639,7 @@ export function keys<T>(x: T): readonly string[];
618
639
  */
619
640
  export function last(str: string): string;
620
641
  export function last(emptyList: readonly []): undefined;
621
- export function last<T extends any>(list: readonly T[]): T;
642
+ export function last<T extends any>(list: readonly T[]): T | undefined;
622
643
 
623
644
  /**
624
645
  * It returns the last index of `target` in `list` array.
@@ -744,8 +765,8 @@ export function median(list: readonly number[]): number;
744
765
  /**
745
766
  * It creates a copy of `target` object with overidden `newProps` properties.
746
767
  */
747
- export function merge<Output>(target: object, newProps: object): Output;
748
- export function merge<Output>(target: object): (newProps: object) => Output;
768
+ export function merge<A, B>(target: A, newProps: B): A & B
769
+ export function merge<Output>(target: any): (newProps: any) => Output;
749
770
 
750
771
  /**
751
772
  * It merges all objects of `list` array sequentially and returns the result.
@@ -938,197 +959,61 @@ export function pickAll<T, U>(propsToPick: string): (input: T) => U;
938
959
  /**
939
960
  * It performs left-to-right function composition.
940
961
  */
941
- export function pipe<T1>(fn0: () => T1): () => T1;
942
- export function pipe<V0, T1>(fn0: (x0: V0) => T1): (x0: V0) => T1;
943
- export function pipe<V0, V1, T1>(fn0: (x0: V0, x1: V1) => T1): (x0: V0, x1: V1) => T1;
944
- export function pipe<V0, V1, V2, T1>(fn0: (x0: V0, x1: V1, x2: V2) => T1): (x0: V0, x1: V1, x2: V2) => T1;
945
-
946
- export function pipe<T1, T2>(fn0: () => T1, fn1: (x: T1) => T2): () => T2;
947
- export function pipe<V0, T1, T2>(fn0: (x0: V0) => T1, fn1: (x: T1) => T2): (x0: V0) => T2;
948
- export function pipe<V0, V1, T1, T2>(fn0: (x0: V0, x1: V1) => T1, fn1: (x: T1) => T2): (x0: V0, x1: V1) => T2;
949
- export function pipe<V0, V1, V2, T1, T2>(fn0: (x0: V0, x1: V1, x2: V2) => T1, fn1: (x: T1) => T2): (x0: V0, x1: V1, x2: V2) => T2;
950
-
951
- export function pipe<T1, T2, T3>(fn0: () => T1, fn1: (x: T1) => T2, fn2: (x: T2) => T3): () => T3;
952
- export function pipe<V0, T1, T2, T3>(fn0: (x: V0) => T1, fn1: (x: T1) => T2, fn2: (x: T2) => T3): (x: V0) => T3;
953
- export function pipe<V0, V1, T1, T2, T3>(fn0: (x0: V0, x1: V1) => T1, fn1: (x: T1) => T2, fn2: (x: T2) => T3): (x0: V0, x1: V1) => T3;
954
- export function pipe<V0, V1, V2, T1, T2, T3>(fn0: (x0: V0, x1: V1, x2: V2) => T1, fn1: (x: T1) => T2, fn2: (x: T2) => T3): (x0: V0, x1: V1, x2: V2) => T3;
955
-
956
- export function pipe<T1, T2, T3, T4>(fn0: () => T1, fn1: (x: T1) => T2, fn2: (x: T2) => T3, fn3: (x: T3) => T4): () => T4;
957
- export function pipe<V0, T1, T2, T3, T4>(fn0: (x: V0) => T1, fn1: (x: T1) => T2, fn2: (x: T2) => T3, fn3: (x: T3) => T4): (x: V0) => T4;
958
- export function pipe<V0, V1, T1, T2, T3, T4>(fn0: (x0: V0, x1: V1) => T1, fn1: (x: T1) => T2, fn2: (x: T2) => T3, fn3: (x: T3) => T4): (x0: V0, x1: V1) => T4;
959
- export function pipe<V0, V1, V2, T1, T2, T3, T4>(fn0: (x0: V0, x1: V1, x2: V2) => T1, fn1: (x: T1) => T2, fn2: (x: T2) => T3, fn3: (x: T3) => T4): (x0: V0, x1: V1, x2: V2) => T4;
960
-
961
- export function pipe<T1, T2, T3, T4, T5>(fn0: () => T1, fn1: (x: T1) => T2, fn2: (x: T2) => T3, fn3: (x: T3) => T4, fn4: (x: T4) => T5): () => T5;
962
- export function pipe<V0, T1, T2, T3, T4, T5>(fn0: (x: V0) => T1, fn1: (x: T1) => T2, fn2: (x: T2) => T3, fn3: (x: T3) => T4, fn4: (x: T4) => T5): (x: V0) => T5;
963
- export function pipe<V0, V1, T1, T2, T3, T4, T5>(fn0: (x0: V0, x1: V1) => T1, fn1: (x: T1) => T2, fn2: (x: T2) => T3, fn3: (x: T3) => T4, fn4: (x: T4) => T5): (x0: V0, x1: V1) => T5;
964
- export function pipe<V0, V1, V2, T1, T2, T3, T4, T5>(fn0: (x0: V0, x1: V1, x2: V2) => T1, fn1: (x: T1) => T2, fn2: (x: T2) => T3, fn3: (x: T3) => T4, fn4: (x: T4) => T5): (x0: V0, x1: V1, x2: V2) => T5;
965
-
966
- export function pipe<T1, T2, T3, T4, T5, T6>(fn0: () => T1, fn1: (x: T1) => T2, fn2: (x: T2) => T3, fn3: (x: T3) => T4, fn4: (x: T4) => T5, fn5: (x: T5) => T6): () => T6;
967
- export function pipe<V0, T1, T2, T3, T4, T5, T6>(fn0: (x: V0) => T1, fn1: (x: T1) => T2, fn2: (x: T2) => T3, fn3: (x: T3) => T4, fn4: (x: T4) => T5, fn5: (x: T5) => T6): (x: V0) => T6;
968
- export function pipe<V0, V1, T1, T2, T3, T4, T5, T6>(fn0: (x0: V0, x1: V1) => T1, fn1: (x: T1) => T2, fn2: (x: T2) => T3, fn3: (x: T3) => T4, fn4: (x: T4) => T5, fn5: (x: T5) => T6): (x0: V0, x1: V1) => T6;
969
- export function pipe<V0, V1, V2, T1, T2, T3, T4, T5, T6>(
970
- fn0: (x0: V0, x1: V1, x2: V2) => T1,
971
- fn1: (x: T1) => T2,
972
- fn2: (x: T2) => T3,
973
- fn3: (x: T3) => T4,
974
- fn4: (x: T4) => T5,
975
- fn5: (x: T5) => T6): (x0: V0, x1: V1, x2: V2) => T6;
976
-
977
- export function pipe<T1, T2, T3, T4, T5, T6, T7>(
978
- fn0: () => T1,
979
- fn1: (x: T1) => T2,
980
- fn2: (x: T2) => T3,
981
- fn3: (x: T3) => T4,
982
- fn4: (x: T4) => T5,
983
- fn5: (x: T5) => T6,
984
- fn: (x: T6) => T7): () => T7;
985
- export function pipe<V0, T1, T2, T3, T4, T5, T6, T7>(
986
- fn0: (x: V0) => T1,
987
- fn1: (x: T1) => T2,
988
- fn2: (x: T2) => T3,
989
- fn3: (x: T3) => T4,
990
- fn4: (x: T4) => T5,
991
- fn5: (x: T5) => T6,
992
- fn: (x: T6) => T7): (x: V0) => T7;
993
- export function pipe<V0, V1, T1, T2, T3, T4, T5, T6, T7>(
994
- fn0: (x0: V0, x1: V1) => T1,
995
- fn1: (x: T1) => T2,
996
- fn2: (x: T2) => T3,
997
- fn3: (x: T3) => T4,
998
- fn4: (x: T4) => T5,
999
- fn5: (x: T5) => T6,
1000
- fn6: (x: T6) => T7): (x0: V0, x1: V1) => T7;
1001
- export function pipe<V0, V1, V2, T1, T2, T3, T4, T5, T6, T7>(
1002
- fn0: (x0: V0, x1: V1, x2: V2) => T1,
1003
- fn1: (x: T1) => T2,
1004
- fn2: (x: T2) => T3,
1005
- fn3: (x: T3) => T4,
1006
- fn4: (x: T4) => T5,
1007
- fn5: (x: T5) => T6,
1008
- fn6: (x: T6) => T7): (x0: V0, x1: V1, x2: V2) => T7;
1009
-
1010
- export function pipe<T1, T2, T3, T4, T5, T6, T7, T8>(
1011
- fn0: () => T1,
1012
- fn1: (x: T1) => T2,
1013
- fn2: (x: T2) => T3,
1014
- fn3: (x: T3) => T4,
1015
- fn4: (x: T4) => T5,
1016
- fn5: (x: T5) => T6,
1017
- fn6: (x: T6) => T7,
1018
- fn: (x: T7) => T8): () => T8;
1019
- export function pipe<V0, T1, T2, T3, T4, T5, T6, T7, T8>(
1020
- fn0: (x: V0) => T1,
1021
- fn1: (x: T1) => T2,
1022
- fn2: (x: T2) => T3,
1023
- fn3: (x: T3) => T4,
1024
- fn4: (x: T4) => T5,
1025
- fn5: (x: T5) => T6,
1026
- fn6: (x: T6) => T7,
1027
- fn: (x: T7) => T8): (x: V0) => T8;
1028
- export function pipe<V0, V1, T1, T2, T3, T4, T5, T6, T7, T8>(
1029
- fn0: (x0: V0, x1: V1) => T1,
1030
- fn1: (x: T1) => T2,
1031
- fn2: (x: T2) => T3,
1032
- fn3: (x: T3) => T4,
1033
- fn4: (x: T4) => T5,
1034
- fn5: (x: T5) => T6,
1035
- fn6: (x: T6) => T7,
1036
- fn7: (x: T7) => T8): (x0: V0, x1: V1) => T8;
1037
- export function pipe<V0, V1, V2, T1, T2, T3, T4, T5, T6, T7, T8>(
1038
- fn0: (x0: V0, x1: V1, x2: V2) => T1,
1039
- fn1: (x: T1) => T2,
1040
- fn2: (x: T2) => T3,
1041
- fn3: (x: T3) => T4,
1042
- fn4: (x: T4) => T5,
1043
- fn5: (x: T5) => T6,
1044
- fn6: (x: T6) => T7,
1045
- fn7: (x: T7) => T8): (x0: V0, x1: V1, x2: V2) => T8;
1046
-
1047
- export function pipe<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
1048
- fn0: () => T1,
1049
- fn1: (x: T1) => T2,
1050
- fn2: (x: T2) => T3,
1051
- fn3: (x: T3) => T4,
1052
- fn4: (x: T4) => T5,
1053
- fn5: (x: T5) => T6,
1054
- fn6: (x: T6) => T7,
1055
- fn7: (x: T7) => T8,
1056
- fn8: (x: T8) => T9): () => T9;
1057
- export function pipe<V0, T1, T2, T3, T4, T5, T6, T7, T8, T9>(
1058
- fn0: (x0: V0) => T1,
1059
- fn1: (x: T1) => T2,
1060
- fn2: (x: T2) => T3,
1061
- fn3: (x: T3) => T4,
1062
- fn4: (x: T4) => T5,
1063
- fn5: (x: T5) => T6,
1064
- fn6: (x: T6) => T7,
1065
- fn7: (x: T7) => T8,
1066
- fn8: (x: T8) => T9): (x0: V0) => T9;
1067
- export function pipe<V0, V1, T1, T2, T3, T4, T5, T6, T7, T8, T9>(
1068
- fn0: (x0: V0, x1: V1) => T1,
1069
- fn1: (x: T1) => T2,
1070
- fn2: (x: T2) => T3,
1071
- fn3: (x: T3) => T4,
1072
- fn4: (x: T4) => T5,
1073
- fn5: (x: T5) => T6,
1074
- fn6: (x: T6) => T7,
1075
- fn7: (x: T7) => T8,
1076
- fn8: (x: T8) => T9): (x0: V0, x1: V1) => T9;
1077
- export function pipe<V0, V1, V2, T1, T2, T3, T4, T5, T6, T7, T8, T9>(
1078
- fn0: (x0: V0, x1: V1, x2: V2) => T1,
1079
- fn1: (x: T1) => T2,
1080
- fn2: (x: T2) => T3,
1081
- fn3: (x: T3) => T4,
1082
- fn4: (x: T4) => T5,
1083
- fn5: (x: T5) => T6,
1084
- fn6: (x: T6) => T7,
1085
- fn7: (x: T7) => T8,
1086
- fn8: (x: T8) => T9): (x0: V0, x1: V1, x2: V2) => T9;
1087
-
1088
- export function pipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(
1089
- fn0: () => T1,
1090
- fn1: (x: T1) => T2,
1091
- fn2: (x: T2) => T3,
1092
- fn3: (x: T3) => T4,
1093
- fn4: (x: T4) => T5,
1094
- fn5: (x: T5) => T6,
1095
- fn6: (x: T6) => T7,
1096
- fn7: (x: T7) => T8,
1097
- fn8: (x: T8) => T9,
1098
- fn9: (x: T9) => T10): () => T10;
1099
- export function pipe<V0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(
1100
- fn0: (x0: V0) => T1,
1101
- fn1: (x: T1) => T2,
1102
- fn2: (x: T2) => T3,
1103
- fn3: (x: T3) => T4,
1104
- fn4: (x: T4) => T5,
1105
- fn5: (x: T5) => T6,
1106
- fn6: (x: T6) => T7,
1107
- fn7: (x: T7) => T8,
1108
- fn8: (x: T8) => T9,
1109
- fn9: (x: T9) => T10): (x0: V0) => T10;
1110
- export function pipe<V0, V1, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(
1111
- fn0: (x0: V0, x1: V1) => T1,
1112
- fn1: (x: T1) => T2,
1113
- fn2: (x: T2) => T3,
1114
- fn3: (x: T3) => T4,
1115
- fn4: (x: T4) => T5,
1116
- fn5: (x: T5) => T6,
1117
- fn6: (x: T6) => T7,
1118
- fn7: (x: T7) => T8,
1119
- fn8: (x: T8) => T9,
1120
- fn9: (x: T9) => T10): (x0: V0, x1: V1) => T10;
1121
- export function pipe<V0, V1, V2, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(
1122
- fn0: (x0: V0, x1: V1, x2: V2) => T1,
1123
- fn1: (x: T1) => T2,
1124
- fn2: (x: T2) => T3,
1125
- fn3: (x: T3) => T4,
1126
- fn4: (x: T4) => T5,
1127
- fn5: (x: T5) => T6,
1128
- fn6: (x: T6) => T7,
1129
- fn7: (x: T7) => T8,
1130
- fn8: (x: T8) => T9,
1131
- fn9: (x: T9) => T10): (x0: V0, x1: V1, x2: V2) => T10;
962
+ export function pipe<TArgs extends readonly any[], R1, R2, R3, R4, R5, R6, R7, TResult>(
963
+ ...funcs: readonly [
964
+ f1: (...args: TArgs) => R1,
965
+ f2: (a: R1) => R2,
966
+ f3: (a: R2) => R3,
967
+ f4: (a: R3) => R4,
968
+ f5: (a: R4) => R5,
969
+ f6: (a: R5) => R6,
970
+ f7: (a: R6) => R7,
971
+ ...func: ReadonlyArray<(a: any) => any>,
972
+ fnLast: (a: any) => TResult
973
+ ]
974
+ ): (...args: TArgs) => TResult; // fallback overload if number of piped functions greater than 7
975
+ export function pipe<TArgs extends readonly any[], R1, R2, R3, R4, R5, R6, R7>(
976
+ f1: (...args: TArgs) => R1,
977
+ f2: (a: R1) => R2,
978
+ f3: (a: R2) => R3,
979
+ f4: (a: R3) => R4,
980
+ f5: (a: R4) => R5,
981
+ f6: (a: R5) => R6,
982
+ f7: (a: R6) => R7
983
+ ): (...args: TArgs) => R7;
984
+ export function pipe<TArgs extends readonly any[], R1, R2, R3, R4, R5, R6>(
985
+ f1: (...args: TArgs) => R1,
986
+ f2: (a: R1) => R2,
987
+ f3: (a: R2) => R3,
988
+ f4: (a: R3) => R4,
989
+ f5: (a: R4) => R5,
990
+ f6: (a: R5) => R6
991
+ ): (...args: TArgs) => R6;
992
+ export function pipe<TArgs extends readonly any[], R1, R2, R3, R4, R5>(
993
+ f1: (...args: TArgs) => R1,
994
+ f2: (a: R1) => R2,
995
+ f3: (a: R2) => R3,
996
+ f4: (a: R3) => R4,
997
+ f5: (a: R4) => R5
998
+ ): (...args: TArgs) => R5;
999
+ export function pipe<TArgs extends readonly any[], R1, R2, R3, R4>(
1000
+ f1: (...args: TArgs) => R1,
1001
+ f2: (a: R1) => R2,
1002
+ f3: (a: R2) => R3,
1003
+ f4: (a: R3) => R4
1004
+ ): (...args: TArgs) => R4;
1005
+ export function pipe<TArgs extends readonly any[], R1, R2, R3>(
1006
+ f1: (...args: TArgs) => R1,
1007
+ f2: (a: R1) => R2,
1008
+ f3: (a: R2) => R3
1009
+ ): (...args: TArgs) => R3;
1010
+ export function pipe<TArgs extends readonly any[], R1, R2>(
1011
+ f1: (...args: TArgs) => R1,
1012
+ f2: (a: R1) => R2
1013
+ ): (...args: TArgs) => R2;
1014
+ export function pipe<TArgs extends readonly any[], R1>(
1015
+ f1: (...args: TArgs) => R1
1016
+ ): (...args: TArgs) => R1;
1132
1017
 
1133
1018
  /**
1134
1019
  * It returns list of the values of `property` taken from the all objects inside `list`.
@@ -1151,9 +1036,10 @@ export function product(list: readonly number[]): number;
1151
1036
  *
1152
1037
  * If there is no such property, it returns `undefined`.
1153
1038
  */
1154
- export function prop<P extends keyof T, T>(propToFind: P, obj: T): T[P];
1155
- export function prop<P extends string | number>(p: P): <T>(propToFind: Record<P, T>) => T;
1156
- export function prop<P extends keyof T, T>(p: P): (propToFind: Record<P, T>) => T;
1039
+ export function prop<P extends keyof O, O>(propToFind: P, obj: O): O[P];
1040
+ export function prop<P extends keyof O, O>(propToFind: P): (obj: O) => O[P];
1041
+ export function prop<P extends string | number>(propToFind: P): <T>(obj: Record<P, T>) => T;
1042
+ export function prop<P extends string | number, T>(propToFind: P): (obj: Record<P, T>) => T;
1157
1043
 
1158
1044
  /**
1159
1045
  * It returns true if `obj` has property `propToFind` and its value is equal to `valueToMatch`.
@@ -1168,11 +1054,17 @@ export function propEq<K extends string | number>(propToFind: K): {
1168
1054
  /**
1169
1055
  * It returns `true` if `property` of `obj` is from `target` type.
1170
1056
  */
1171
- export function propIs(type: any, name: string, obj: any): boolean;
1172
- export function propIs(type: any, name: string): (obj: any) => boolean;
1173
- export function propIs(type: any): {
1174
- (name: string, obj: any): boolean;
1175
- (name: string): (obj: any) => boolean;
1057
+ export function propIs<C extends (...args: readonly any[]) => any, K extends keyof any>(type: C, name: K, obj: any): obj is Record<K, ReturnType<C>>;
1058
+ export function propIs<C extends new (...args: readonly any[]) => any, K extends keyof any>(type: C, name: K, obj: any): obj is Record<K, InstanceType<C>>;
1059
+ export function propIs<C extends (...args: readonly any[]) => any, K extends keyof any>(type: C, name: K): (obj: any) => obj is Record<K, ReturnType<C>>;
1060
+ export function propIs<C extends new (...args: readonly any[]) => any, K extends keyof any>(type: C, name: K): (obj: any) => obj is Record<K, InstanceType<C>>;
1061
+ export function propIs<C extends (...args: readonly any[]) => any>(type: C): {
1062
+ <K extends keyof any>(name: K, obj: any): obj is Record<K, ReturnType<C>>;
1063
+ <K extends keyof any>(name: K): (obj: any) => obj is Record<K, ReturnType<C>>;
1064
+ };
1065
+ export function propIs<C extends new (...args: readonly any[]) => any>(type: C): {
1066
+ <K extends keyof any>(name: K, obj: any): obj is Record<K, InstanceType<C>>;
1067
+ <K extends keyof any>(name: K): (obj: any) => obj is Record<K, InstanceType<C>>;
1176
1068
  };
1177
1069
 
1178
1070
  /**
@@ -1232,15 +1124,16 @@ export function slice(from: number): {
1232
1124
  };
1233
1125
 
1234
1126
  /**
1235
- * It returns copy of `list` sorted by `sortFn` function.
1127
+ * It returns copy of `list` sorted by `sortFn` function, where `sortFn` needs to return only `-1`, `0` or `1`.
1236
1128
  */
1237
1129
  export function sort<T>(sortFn: (a: T, b: T) => number, list: readonly T[]): readonly T[];
1238
1130
  export function sort<T>(sortFn: (a: T, b: T) => number): (list: readonly T[]) => readonly T[];
1239
1131
 
1240
1132
  /**
1241
- * It returns copy of `list` sorted by `sortFn` function.
1133
+ * It returns copy of `list` sorted by `sortFn` function, where `sortFn` function returns a value to compare, i.e. it doesn't need to return only `-1`, `0` or `1`.
1242
1134
  */
1243
1135
  export function sortBy<T>(sortFn: (a: T) => Ord, list: readonly T[]): readonly T[];
1136
+ export function sortBy<T>(sortFn: (a: T) => Ord): (list: readonly T[]) => readonly T[];
1244
1137
  export function sortBy(sortFn: (a: any) => Ord): <T>(list: readonly T[]) => readonly T[];
1245
1138
 
1246
1139
  /**
@@ -1252,18 +1145,21 @@ export function split(separator: string | RegExp, str: string): readonly string[
1252
1145
  /**
1253
1146
  * It splits `input` into slices of `sliceLength`.
1254
1147
  */
1255
- export function splitEvery<T>(sliceLength: number, input: readonly T[]): readonly (readonly T[])[];
1148
+ export function splitEvery<T>(sliceLength: number, input: readonly T[]): readonly ((readonly T[]))[];
1256
1149
  export function splitEvery(sliceLength: number, input: string): readonly string[];
1257
1150
  export function splitEvery(sliceLength: number): {
1258
1151
  (input: string): readonly string[];
1259
- <T>(input: readonly T[]): readonly (readonly T[])[];
1152
+ <T>(input: readonly T[]): readonly ((readonly T[]))[];
1260
1153
  };
1261
1154
 
1262
1155
  /**
1263
- * Curried version of `String.prototype.startsWith`
1156
+ * When iterable is a string, then it behaves as `String.prototype.startsWith`.
1157
+ * When iterable is a list, then it uses R.equals to determine if the target list starts in the same way as the given target.
1264
1158
  */
1265
1159
  export function startsWith(target: string, str: string): boolean;
1266
1160
  export function startsWith(target: string): (str: string) => boolean;
1161
+ export function startsWith<T>(target: readonly T[], list: readonly T[]): boolean;
1162
+ export function startsWith<T>(target: readonly T[]): (list: readonly T[]) => boolean;
1267
1163
 
1268
1164
  /**
1269
1165
  * Curried version of `x - y`
@@ -1331,18 +1227,21 @@ export function test(regExpression: RegExp, str: string): boolean;
1331
1227
  export function times<T>(fn: (i: number) => T, howMany: number): readonly T[];
1332
1228
  export function times<T>(fn: (i: number) => T): (howMany: number) => readonly T[];
1333
1229
 
1230
+ export function toLower<S extends string>(str: S): Lowercase<S>;
1334
1231
  export function toLower(str: string): string;
1335
1232
 
1233
+ export function toUpper<S extends string>(str: S): Uppercase<S>;
1336
1234
  export function toUpper(str: string): string;
1337
1235
 
1338
1236
  /**
1339
1237
  * It transforms an object to a list.
1340
1238
  */
1341
- export function toPairs<S>(obj: { readonly [k: string]: S } | { readonly [k: number]: S }): readonly (readonly [string, S])[];
1239
+ export function toPairs<O extends object, K extends Extract<keyof O, string | number>>(obj: O): ReadonlyArray<{ readonly [key in K]: readonly [`${key}`, O[key]] }[K]>;
1240
+ export function toPairs<S>(obj: Record<string | number, S>): ReadonlyArray<readonly [string, S]>;
1342
1241
 
1343
- export function toString<T>(x: T): string;
1242
+ export function toString(x: unknown): string;
1344
1243
 
1345
- export function transpose<T>(list: readonly (readonly T[])[]): readonly (readonly T[])[];
1244
+ export function transpose<T>(list: readonly ((readonly T[]))[]): readonly ((readonly T[]))[];
1346
1245
 
1347
1246
  export function trim(str: string): string;
1348
1247
 
@@ -1401,8 +1300,10 @@ export function uniqWith<T, U>(predicate: (x: T, y: T) => boolean): (list: reado
1401
1300
  *
1402
1301
  * In the other case, the final output will be the `input` itself.
1403
1302
  */
1404
- export function unless<T, U>(predicate: (x: T) => boolean, whenFalseFn: (x: T) => U, obj: T): U;
1405
- export function unless<T, U>(predicate: (x: T) => boolean, whenFalseFn: (x: T) => U): (obj: T) => U;
1303
+ export function unless<T, U>(predicate: (x: T) => boolean, whenFalseFn: (x: T) => U, x: T): T | U;
1304
+ export function unless<T, U>(predicate: (x: T) => boolean, whenFalseFn: (x: T) => U): (x: T) => T | U;
1305
+ export function unless<T>(predicate: (x: T) => boolean, whenFalseFn: (x: T) => T, x: T): T;
1306
+ export function unless<T>(predicate: (x: T) => boolean, whenFalseFn: (x: T) => T): (x: T) => T;
1406
1307
 
1407
1308
  /**
1408
1309
  * It returns a copy of `list` with updated element at `index` with `newValue`.
@@ -1491,8 +1392,8 @@ export function splitAt(index: number): {
1491
1392
  *
1492
1393
  * The first array contains all members of `list` before `predicate` returns `true`.
1493
1394
  */
1494
- export function splitWhen<T, U>(predicate: Predicate<T>, list: readonly U[]): readonly (readonly U[])[];
1495
- export function splitWhen<T>(predicate: Predicate<T>): <U>(list: readonly U[]) => readonly (readonly U[])[];
1395
+ export function splitWhen<T, U>(predicate: Predicate<T>, list: readonly U[]): readonly ((readonly U[]))[];
1396
+ export function splitWhen<T>(predicate: Predicate<T>): <U>(list: readonly U[]) => readonly ((readonly U[]))[];
1496
1397
 
1497
1398
  export function takeLastWhile(predicate: (x: string) => boolean, input: string): string;
1498
1399
  export function takeLastWhile(predicate: (x: string) => boolean): (input: string) => string;
@@ -1536,3 +1437,24 @@ export function takeWhile<T>(fn: Predicate<T>): (iterable: readonly T[]) => read
1536
1437
  export function eqProps<T, U>(prop: string, obj1: T, obj2: U): boolean;
1537
1438
  export function eqProps<P extends string>(prop: P): <T, U>(obj1: Record<P, T>, obj2: Record<P, U>) => boolean;
1538
1439
  export function eqProps<T>(prop: string, obj1: T): <U>(obj2: U) => boolean;
1440
+
1441
+ /**
1442
+ * It calls a function `fn` with the list of values of the returned function.
1443
+ *
1444
+ * `R.unapply` is the opposite of `R.apply` method.
1445
+ */
1446
+ export function unapply<T = any>(fn: (args: readonly any[]) => T): (...args: readonly any[]) => T;
1447
+
1448
+ /**
1449
+ * It applies function `fn` to the list of arguments.
1450
+ *
1451
+ * This is useful for creating a fixed-arity function from a variadic function. `fn` should be a bound function if context is significant.
1452
+ */
1453
+ export function apply<T = any>(fn: (...args: readonly any[]) => T, args: readonly any[]): T;
1454
+ export function apply<T = any>(fn: (...args: readonly any[]) => T): (args: readonly any[]) => T;
1455
+
1456
+ /**
1457
+ * Creates a function that is bound to a context.
1458
+ */
1459
+ export function bind<F extends (...args: readonly any[]) => any, T>(fn: F, thisObj: T): (...args: Parameters<F>) => ReturnType<F>;
1460
+ export function bind<F extends (...args: readonly any[]) => any, T>(fn: F): (thisObj: T) => (...args: Parameters<F>) => ReturnType<F>;