rambda 6.8.3 → 7.0.2

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 +95 -0
  2. package/README.md +4157 -4921
  3. package/dist/rambda.esm.js +336 -209
  4. package/dist/rambda.js +340 -209
  5. package/dist/rambda.mjs +336 -209
  6. package/dist/rambda.umd.js +1 -1
  7. package/immutable.d.ts +203 -284
  8. package/index.d.ts +194 -275
  9. package/package.json +119 -95
  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 +5 -0
  18. package/src/_internals/isTruthy.js +5 -5
  19. package/src/_internals/set.js +35 -0
  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 -22
  77. package/src/indexBy.js +11 -11
  78. package/src/indexOf.js +5 -12
  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 +3 -3
  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 +7 -10
  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 +5 -5
  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`.
@@ -1168,11 +1053,17 @@ export function propEq<K extends string | number>(propToFind: K): {
1168
1053
  /**
1169
1054
  * It returns `true` if `property` of `obj` is from `target` type.
1170
1055
  */
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;
1056
+ 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>>;
1057
+ 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>>;
1058
+ 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>>;
1059
+ 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>>;
1060
+ export function propIs<C extends (...args: readonly any[]) => any>(type: C): {
1061
+ <K extends keyof any>(name: K, obj: any): obj is Record<K, ReturnType<C>>;
1062
+ <K extends keyof any>(name: K): (obj: any) => obj is Record<K, ReturnType<C>>;
1063
+ };
1064
+ export function propIs<C extends new (...args: readonly any[]) => any>(type: C): {
1065
+ <K extends keyof any>(name: K, obj: any): obj is Record<K, InstanceType<C>>;
1066
+ <K extends keyof any>(name: K): (obj: any) => obj is Record<K, InstanceType<C>>;
1176
1067
  };
1177
1068
 
1178
1069
  /**
@@ -1232,15 +1123,16 @@ export function slice(from: number): {
1232
1123
  };
1233
1124
 
1234
1125
  /**
1235
- * It returns copy of `list` sorted by `sortFn` function.
1126
+ * It returns copy of `list` sorted by `sortFn` function, where `sortFn` needs to return only `-1`, `0` or `1`.
1236
1127
  */
1237
1128
  export function sort<T>(sortFn: (a: T, b: T) => number, list: readonly T[]): readonly T[];
1238
1129
  export function sort<T>(sortFn: (a: T, b: T) => number): (list: readonly T[]) => readonly T[];
1239
1130
 
1240
1131
  /**
1241
- * It returns copy of `list` sorted by `sortFn` function.
1132
+ * 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
1133
  */
1243
1134
  export function sortBy<T>(sortFn: (a: T) => Ord, list: readonly T[]): readonly T[];
1135
+ export function sortBy<T>(sortFn: (a: T) => Ord): (list: readonly T[]) => readonly T[];
1244
1136
  export function sortBy(sortFn: (a: any) => Ord): <T>(list: readonly T[]) => readonly T[];
1245
1137
 
1246
1138
  /**
@@ -1252,18 +1144,21 @@ export function split(separator: string | RegExp, str: string): readonly string[
1252
1144
  /**
1253
1145
  * It splits `input` into slices of `sliceLength`.
1254
1146
  */
1255
- export function splitEvery<T>(sliceLength: number, input: readonly T[]): readonly (readonly T[])[];
1147
+ export function splitEvery<T>(sliceLength: number, input: readonly T[]): readonly ((readonly T[]))[];
1256
1148
  export function splitEvery(sliceLength: number, input: string): readonly string[];
1257
1149
  export function splitEvery(sliceLength: number): {
1258
1150
  (input: string): readonly string[];
1259
- <T>(input: readonly T[]): readonly (readonly T[])[];
1151
+ <T>(input: readonly T[]): readonly ((readonly T[]))[];
1260
1152
  };
1261
1153
 
1262
1154
  /**
1263
- * Curried version of `String.prototype.startsWith`
1155
+ * When iterable is a string, then it behaves as `String.prototype.startsWith`.
1156
+ * 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
1157
  */
1265
1158
  export function startsWith(target: string, str: string): boolean;
1266
1159
  export function startsWith(target: string): (str: string) => boolean;
1160
+ export function startsWith<T>(target: readonly T[], list: readonly T[]): boolean;
1161
+ export function startsWith<T>(target: readonly T[]): (list: readonly T[]) => boolean;
1267
1162
 
1268
1163
  /**
1269
1164
  * Curried version of `x - y`
@@ -1331,18 +1226,21 @@ export function test(regExpression: RegExp, str: string): boolean;
1331
1226
  export function times<T>(fn: (i: number) => T, howMany: number): readonly T[];
1332
1227
  export function times<T>(fn: (i: number) => T): (howMany: number) => readonly T[];
1333
1228
 
1229
+ export function toLower<S extends string>(str: S): Lowercase<S>;
1334
1230
  export function toLower(str: string): string;
1335
1231
 
1232
+ export function toUpper<S extends string>(str: S): Uppercase<S>;
1336
1233
  export function toUpper(str: string): string;
1337
1234
 
1338
1235
  /**
1339
1236
  * It transforms an object to a list.
1340
1237
  */
1341
- export function toPairs<S>(obj: { readonly [k: string]: S } | { readonly [k: number]: S }): readonly (readonly [string, S])[];
1238
+ 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]>;
1239
+ export function toPairs<S>(obj: Record<string | number, S>): ReadonlyArray<readonly [string, S]>;
1342
1240
 
1343
- export function toString<T>(x: T): string;
1241
+ export function toString(x: unknown): string;
1344
1242
 
1345
- export function transpose<T>(list: readonly (readonly T[])[]): readonly (readonly T[])[];
1243
+ export function transpose<T>(list: readonly ((readonly T[]))[]): readonly ((readonly T[]))[];
1346
1244
 
1347
1245
  export function trim(str: string): string;
1348
1246
 
@@ -1401,8 +1299,10 @@ export function uniqWith<T, U>(predicate: (x: T, y: T) => boolean): (list: reado
1401
1299
  *
1402
1300
  * In the other case, the final output will be the `input` itself.
1403
1301
  */
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;
1302
+ export function unless<T, U>(predicate: (x: T) => boolean, whenFalseFn: (x: T) => U, x: T): 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>(predicate: (x: T) => boolean, whenFalseFn: (x: T) => T, x: T): T;
1305
+ export function unless<T>(predicate: (x: T) => boolean, whenFalseFn: (x: T) => T): (x: T) => T;
1406
1306
 
1407
1307
  /**
1408
1308
  * It returns a copy of `list` with updated element at `index` with `newValue`.
@@ -1421,8 +1321,6 @@ export function when<T, U>(predicate: (x: T) => boolean): ((whenTrueFn: (a: T) =
1421
1321
 
1422
1322
  /**
1423
1323
  * It returns `true` if all each property in `conditions` returns `true` when applied to corresponding property in `input` object.
1424
- *
1425
- * `R.equals` is used to determine equality.
1426
1324
  */
1427
1325
  export function where<T, U>(conditions: T, input: U): boolean;
1428
1326
  export function where<T>(conditions: T): <U>(input: U) => boolean;
@@ -1493,8 +1391,8 @@ export function splitAt(index: number): {
1493
1391
  *
1494
1392
  * The first array contains all members of `list` before `predicate` returns `true`.
1495
1393
  */
1496
- export function splitWhen<T, U>(predicate: Predicate<T>, list: readonly U[]): readonly (readonly U[])[];
1497
- export function splitWhen<T>(predicate: Predicate<T>): <U>(list: readonly U[]) => readonly (readonly U[])[];
1394
+ export function splitWhen<T, U>(predicate: Predicate<T>, list: readonly U[]): readonly ((readonly U[]))[];
1395
+ export function splitWhen<T>(predicate: Predicate<T>): <U>(list: readonly U[]) => readonly ((readonly U[]))[];
1498
1396
 
1499
1397
  export function takeLastWhile(predicate: (x: string) => boolean, input: string): string;
1500
1398
  export function takeLastWhile(predicate: (x: string) => boolean): (input: string) => string;
@@ -1538,3 +1436,24 @@ export function takeWhile<T>(fn: Predicate<T>): (iterable: readonly T[]) => read
1538
1436
  export function eqProps<T, U>(prop: string, obj1: T, obj2: U): boolean;
1539
1437
  export function eqProps<P extends string>(prop: P): <T, U>(obj1: Record<P, T>, obj2: Record<P, U>) => boolean;
1540
1438
  export function eqProps<T>(prop: string, obj1: T): <U>(obj2: U) => boolean;
1439
+
1440
+ /**
1441
+ * It calls a function `fn` with the list of values of the returned function.
1442
+ *
1443
+ * `R.unapply` is the opposite of `R.apply` method.
1444
+ */
1445
+ export function unapply<T = any>(fn: (args: readonly any[]) => T): (...args: readonly any[]) => T;
1446
+
1447
+ /**
1448
+ * It applies function `fn` to the list of arguments.
1449
+ *
1450
+ * This is useful for creating a fixed-arity function from a variadic function. `fn` should be a bound function if context is significant.
1451
+ */
1452
+ export function apply<T = any>(fn: (...args: readonly any[]) => T, args: readonly any[]): T;
1453
+ export function apply<T = any>(fn: (...args: readonly any[]) => T): (args: readonly any[]) => T;
1454
+
1455
+ /**
1456
+ * Creates a function that is bound to a context.
1457
+ */
1458
+ export function bind<F extends (...args: readonly any[]) => any, T>(fn: F, thisObj: T): (...args: Parameters<F>) => ReturnType<F>;
1459
+ export function bind<F extends (...args: readonly any[]) => any, T>(fn: F): (thisObj: T) => (...args: Parameters<F>) => ReturnType<F>;