rambda 6.8.1 → 7.0.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.
Files changed (189) hide show
  1. package/CHANGELOG.md +93 -0
  2. package/README.md +4108 -5600
  3. package/dist/rambda.esm.js +340 -212
  4. package/dist/rambda.js +345 -212
  5. package/dist/rambda.mjs +340 -212
  6. package/dist/rambda.umd.js +1 -1
  7. package/immutable.d.ts +202 -275
  8. package/immutable.js +1 -0
  9. package/index.d.ts +202 -275
  10. package/package.json +111 -94
  11. package/src/F.js +1 -1
  12. package/src/T.js +1 -1
  13. package/src/_internals/_isInteger.js +1 -1
  14. package/src/_internals/_objectIs.js +2 -2
  15. package/src/_internals/baseSlice.js +6 -8
  16. package/src/_internals/cloneList.js +3 -0
  17. package/src/_internals/isFalsy.js +5 -5
  18. package/src/_internals/isObject.js +5 -0
  19. package/src/_internals/isTruthy.js +5 -5
  20. package/src/_internals/set.js +35 -0
  21. package/src/add.js +1 -1
  22. package/src/adjust.js +5 -6
  23. package/src/all.js +3 -3
  24. package/src/allPass.js +4 -4
  25. package/src/always.js +1 -1
  26. package/src/and.js +1 -1
  27. package/src/any.js +3 -3
  28. package/src/anyPass.js +4 -4
  29. package/src/append.js +4 -2
  30. package/src/apply.js +7 -0
  31. package/src/applySpec.js +33 -59
  32. package/src/assoc.js +3 -7
  33. package/src/assocPath.js +22 -25
  34. package/src/bind.js +9 -0
  35. package/src/both.js +1 -1
  36. package/src/chain.js +2 -2
  37. package/src/clamp.js +6 -6
  38. package/src/clone.js +10 -10
  39. package/src/complement.js +1 -1
  40. package/src/compose.js +6 -6
  41. package/src/concat.js +2 -2
  42. package/src/cond.js +3 -3
  43. package/src/converge.js +11 -11
  44. package/src/curry.js +2 -2
  45. package/src/curryN.js +61 -81
  46. package/src/defaultTo.js +5 -8
  47. package/src/difference.js +3 -3
  48. package/src/dissoc.js +4 -4
  49. package/src/divide.js +1 -1
  50. package/src/drop.js +1 -1
  51. package/src/dropLast.js +5 -5
  52. package/src/dropLastWhile.js +12 -12
  53. package/src/dropRepeats.js +6 -6
  54. package/src/dropRepeatsWith.js +7 -7
  55. package/src/dropWhile.js +9 -9
  56. package/src/either.js +2 -2
  57. package/src/endsWith.js +20 -3
  58. package/src/eqProps.js +5 -10
  59. package/src/equals.js +119 -38
  60. package/src/evolve.js +23 -21
  61. package/src/filter.js +17 -19
  62. package/src/find.js +4 -4
  63. package/src/findIndex.js +3 -3
  64. package/src/findLast.js +4 -4
  65. package/src/findLastIndex.js +3 -3
  66. package/src/flatten.js +6 -6
  67. package/src/flip.js +11 -15
  68. package/src/forEach.js +10 -12
  69. package/src/fromPairs.js +2 -2
  70. package/src/groupBy.js +6 -6
  71. package/src/groupWith.js +11 -12
  72. package/src/hasPath.js +5 -5
  73. package/src/head.js +3 -3
  74. package/src/identical.js +1 -1
  75. package/src/identity.js +2 -2
  76. package/src/ifElse.js +3 -5
  77. package/src/includes.js +11 -22
  78. package/src/indexBy.js +11 -11
  79. package/src/indexOf.js +5 -12
  80. package/src/init.js +2 -4
  81. package/src/intersection.js +3 -3
  82. package/src/intersperse.js +5 -5
  83. package/src/is.js +2 -2
  84. package/src/isEmpty.js +5 -5
  85. package/src/isFunction.js +3 -3
  86. package/src/isNil.js +1 -1
  87. package/src/isPromise.js +3 -3
  88. package/src/join.js +1 -1
  89. package/src/keys.js +1 -1
  90. package/src/last.js +4 -4
  91. package/src/lastIndexOf.js +5 -11
  92. package/src/length.js +6 -5
  93. package/src/lens.js +3 -3
  94. package/src/lensIndex.js +4 -4
  95. package/src/lensProp.js +4 -4
  96. package/src/map.js +19 -18
  97. package/src/match.js +1 -1
  98. package/src/mathMod.js +2 -2
  99. package/src/max.js +1 -1
  100. package/src/maxBy.js +2 -4
  101. package/src/maybe.js +2 -4
  102. package/src/mean.js +2 -2
  103. package/src/median.js +12 -10
  104. package/src/merge.js +2 -4
  105. package/src/mergeAll.js +3 -3
  106. package/src/mergeDeepRight.js +8 -8
  107. package/src/mergeLeft.js +2 -2
  108. package/src/min.js +1 -1
  109. package/src/minBy.js +2 -4
  110. package/src/modulo.js +1 -1
  111. package/src/move.js +7 -8
  112. package/src/multiply.js +1 -1
  113. package/src/negate.js +1 -1
  114. package/src/none.js +3 -3
  115. package/src/not.js +1 -1
  116. package/src/nth.js +4 -4
  117. package/src/objOf.js +3 -3
  118. package/src/of.js +2 -2
  119. package/src/omit.js +5 -5
  120. package/src/once.js +6 -6
  121. package/src/or.js +1 -1
  122. package/src/over.js +3 -5
  123. package/src/partial.js +3 -3
  124. package/src/partition.js +17 -15
  125. package/src/path.js +6 -6
  126. package/src/pathEq.js +4 -6
  127. package/src/pathOr.js +5 -7
  128. package/src/paths.js +3 -3
  129. package/src/pick.js +5 -5
  130. package/src/pickAll.js +6 -6
  131. package/src/pipe.js +3 -3
  132. package/src/pluck.js +4 -4
  133. package/src/prepend.js +3 -3
  134. package/src/product.js +2 -2
  135. package/src/prop.js +2 -2
  136. package/src/propEq.js +3 -5
  137. package/src/propIs.js +4 -6
  138. package/src/propOr.js +4 -6
  139. package/src/props.js +6 -6
  140. package/src/range.js +4 -4
  141. package/src/reduce.js +7 -11
  142. package/src/reject.js +2 -2
  143. package/src/repeat.js +2 -2
  144. package/src/replace.js +2 -4
  145. package/src/reverse.js +3 -4
  146. package/src/set.js +5 -9
  147. package/src/slice.js +2 -4
  148. package/src/sort.js +4 -4
  149. package/src/sortBy.js +4 -2
  150. package/src/split.js +1 -1
  151. package/src/splitAt.js +9 -9
  152. package/src/splitEvery.js +8 -6
  153. package/src/splitWhen.js +10 -10
  154. package/src/startsWith.js +20 -3
  155. package/src/subtract.js +1 -1
  156. package/src/sum.js +1 -1
  157. package/src/symmetricDifference.js +9 -7
  158. package/src/tail.js +2 -2
  159. package/src/take.js +2 -4
  160. package/src/takeLast.js +2 -4
  161. package/src/takeLastWhile.js +7 -7
  162. package/src/takeWhile.js +8 -8
  163. package/src/tap.js +1 -1
  164. package/src/test.js +5 -3
  165. package/src/times.js +4 -4
  166. package/src/toLower.js +1 -1
  167. package/src/toPairs.js +1 -1
  168. package/src/toString.js +1 -1
  169. package/src/toUpper.js +1 -1
  170. package/src/transpose.js +4 -3
  171. package/src/trim.js +1 -1
  172. package/src/tryCatch.js +5 -5
  173. package/src/type.js +7 -29
  174. package/src/unapply.js +5 -0
  175. package/src/union.js +4 -3
  176. package/src/uniq.js +7 -10
  177. package/src/uniqWith.js +18 -7
  178. package/src/unless.js +3 -3
  179. package/src/update.js +6 -8
  180. package/src/values.js +2 -2
  181. package/src/view.js +2 -2
  182. package/src/when.js +2 -4
  183. package/src/where.js +5 -5
  184. package/src/whereEq.js +9 -7
  185. package/src/without.js +5 -5
  186. package/src/xor.js +2 -2
  187. package/src/zip.js +3 -3
  188. package/src/zipObj.js +4 -6
  189. package/src/zipWith.js +6 -7
package/index.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 = (number | string)[];
12
+ type CondPair<T extends any[], R> = [(...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: ((x: T) => boolean)[]): (input: T) => boo
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: unknown[]) => T;
159
160
 
160
161
  /**
161
162
  * Logical AND
@@ -196,8 +197,8 @@ export function applySpec<T>(spec: any): (...args: 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) => U[], list: T[]): U[];
224
225
  export function chain<T, U>(fn: (n: T) => U[]): (list: T[]) => 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: T[]): 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 any[]>(pred: (...args: T) => boolean): (...args: T) => boolean;
248
+ export function complement<T extends 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 any[], R1, R2, R3, R4, R5, R6, R7, TResult>(
254
+ ...func: [
255
+ fnLast: (a: any) => TResult,
256
+ ...func: Array<(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 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 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 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 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 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 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 any[], R1, R2>(
311
+ f2: (a: R1) => R2,
312
+ f1: (...args: TArgs) => R1
313
+ ): (...args: TArgs) => R2;
314
+ export function compose<TArgs extends 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: ([Pred, (...a: any[]) => any])[]): (...x: any[]) => any;
313
- export function cond<A, B>(conditions: ([SafePred<A>, (...a: A[]) => B])[]): (...x: A[]) => B;
335
+ export function cond<T extends any[], R>(conditions: Array<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: T[]): (b: T[]) => 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: T[], list: T[]): boolean;
419
+ export function endsWith<T>(target: T[]): (list: T[]) => boolean;
395
420
 
396
421
  /**
397
422
  * It deeply compares `x` and `y` and returns `true` if they are equal.
@@ -470,6 +495,8 @@ export function fromPairs<V>(listOfPairs: ([string, V])[]): { [index: string]: V
470
495
  */
471
496
  export function groupBy<T>(groupFn: (x: T) => string, list: T[]): { [index: string]: T[] };
472
497
  export function groupBy<T>(groupFn: (x: T) => string): (list: T[]) => { [index: string]: T[] };
498
+ export function groupBy<T, U>(groupFn: (x: T) => string, list: T[]): U;
499
+ export function groupBy<T, U>(groupFn: (x: T) => string): (list: 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.
@@ -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: T[]): T | undefined;
502
528
  export function head(input: string): string;
529
+ export function head(emptyList: []): undefined;
530
+ export function head<T>(input: 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 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: T[]) => 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): string[];
618
639
  */
619
640
  export function last(str: string): string;
620
641
  export function last(emptyList: []): undefined;
621
- export function last<T extends any>(list: T[]): T;
642
+ export function last<T extends any>(list: T[]): T | undefined;
622
643
 
623
644
  /**
624
645
  * It returns the last index of `target` in `list` array.
@@ -698,6 +719,14 @@ export function map<T, U, S>(fn: ObjectIterator<T, U>): (iterable: Dictionary<T>
698
719
  export function map<T>(fn: Iterator<T, T>): (iterable: T[]) => T[];
699
720
  export function map<T>(fn: Iterator<T, T>, iterable: T[]): T[];
700
721
 
722
+ /**
723
+ * It works the same way as `R.map` does for objects. It is added as Ramda also has this method.
724
+ */
725
+ export function mapObjIndexed<T>(fn: ObjectIterator<T, T>, iterable: Dictionary<T>): Dictionary<T>;
726
+ export function mapObjIndexed<T, U>(fn: ObjectIterator<T, U>, iterable: Dictionary<T>): Dictionary<U>;
727
+ export function mapObjIndexed<T>(fn: ObjectIterator<T, T>): (iterable: Dictionary<T>) => Dictionary<T>;
728
+ export function mapObjIndexed<T, U>(fn: ObjectIterator<T, U>): (iterable: Dictionary<T>) => Dictionary<U>;
729
+
701
730
  /**
702
731
  * Curried version of `String.prototype.match` which returns empty array, when there is no match.
703
732
  */
@@ -736,8 +765,8 @@ export function median(list: number[]): number;
736
765
  /**
737
766
  * It creates a copy of `target` object with overidden `newProps` properties.
738
767
  */
739
- export function merge<Output>(target: object, newProps: object): Output;
740
- 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;
741
770
 
742
771
  /**
743
772
  * It merges all objects of `list` array sequentially and returns the result.
@@ -815,7 +844,7 @@ export function nth<T>(index: number, list: T[]): T | undefined;
815
844
  export function nth(index: number): <T>(list: T[]) => T | undefined;
816
845
 
817
846
  /**
818
- * It returns a new object with the provided key and value.
847
+ * It creates an object with a single key-value pair.
819
848
  */
820
849
  export function objOf<T, K extends string>(key: K, value: T): Record<K, T>;
821
850
  export function objOf<K extends string>(key: K): <T>(value: T) => Record<K, T>;
@@ -852,7 +881,7 @@ export function partial<V0, V1, V2, V3, T>(fn: (x0: V0, x1: V1, x2: V2, x3: V3)
852
881
  export function partial<T>(fn: (...a: any[]) => T, args: any[]): (...x: any[]) => T;
853
882
 
854
883
  /**
855
- * It will return array of two objects/arrays according to `predicate` function. The first member holds all instanses of `input` that pass the `predicate` function, while the second member - those who doesn't.
884
+ * It will return array of two objects/arrays according to `predicate` function. The first member holds all instances of `input` that pass the `predicate` function, while the second member - those who doesn't.
856
885
  */
857
886
  export function partition<T>(
858
887
  predicate: Predicate<T>,
@@ -930,197 +959,61 @@ export function pickAll<T, U>(propsToPick: string): (input: T) => U;
930
959
  /**
931
960
  * It performs left-to-right function composition.
932
961
  */
933
- export function pipe<T1>(fn0: () => T1): () => T1;
934
- export function pipe<V0, T1>(fn0: (x0: V0) => T1): (x0: V0) => T1;
935
- export function pipe<V0, V1, T1>(fn0: (x0: V0, x1: V1) => T1): (x0: V0, x1: V1) => T1;
936
- export function pipe<V0, V1, V2, T1>(fn0: (x0: V0, x1: V1, x2: V2) => T1): (x0: V0, x1: V1, x2: V2) => T1;
937
-
938
- export function pipe<T1, T2>(fn0: () => T1, fn1: (x: T1) => T2): () => T2;
939
- export function pipe<V0, T1, T2>(fn0: (x0: V0) => T1, fn1: (x: T1) => T2): (x0: V0) => T2;
940
- export function pipe<V0, V1, T1, T2>(fn0: (x0: V0, x1: V1) => T1, fn1: (x: T1) => T2): (x0: V0, x1: V1) => T2;
941
- 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;
942
-
943
- export function pipe<T1, T2, T3>(fn0: () => T1, fn1: (x: T1) => T2, fn2: (x: T2) => T3): () => T3;
944
- export function pipe<V0, T1, T2, T3>(fn0: (x: V0) => T1, fn1: (x: T1) => T2, fn2: (x: T2) => T3): (x: V0) => T3;
945
- 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;
946
- 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;
947
-
948
- export function pipe<T1, T2, T3, T4>(fn0: () => T1, fn1: (x: T1) => T2, fn2: (x: T2) => T3, fn3: (x: T3) => T4): () => T4;
949
- 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;
950
- 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;
951
- 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;
952
-
953
- 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;
954
- 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;
955
- 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;
956
- 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;
957
-
958
- 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;
959
- 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;
960
- 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;
961
- export function pipe<V0, V1, V2, T1, T2, T3, T4, T5, T6>(
962
- fn0: (x0: V0, x1: V1, x2: V2) => T1,
963
- fn1: (x: T1) => T2,
964
- fn2: (x: T2) => T3,
965
- fn3: (x: T3) => T4,
966
- fn4: (x: T4) => T5,
967
- fn5: (x: T5) => T6): (x0: V0, x1: V1, x2: V2) => T6;
968
-
969
- export function pipe<T1, T2, T3, T4, T5, T6, T7>(
970
- fn0: () => 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,
976
- fn: (x: T6) => T7): () => T7;
977
- export function pipe<V0, T1, T2, T3, T4, T5, T6, T7>(
978
- fn0: (x: V0) => 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): (x: V0) => T7;
985
- export function pipe<V0, V1, T1, T2, T3, T4, T5, T6, T7>(
986
- fn0: (x0: V0, x1: V1) => 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
- fn6: (x: T6) => T7): (x0: V0, x1: V1) => T7;
993
- export function pipe<V0, V1, V2, T1, T2, T3, T4, T5, T6, T7>(
994
- fn0: (x0: V0, x1: V1, x2: V2) => 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, x2: V2) => T7;
1001
-
1002
- export function pipe<T1, T2, T3, T4, T5, T6, T7, T8>(
1003
- fn0: () => T1,
1004
- fn1: (x: T1) => T2,
1005
- fn2: (x: T2) => T3,
1006
- fn3: (x: T3) => T4,
1007
- fn4: (x: T4) => T5,
1008
- fn5: (x: T5) => T6,
1009
- fn6: (x: T6) => T7,
1010
- fn: (x: T7) => T8): () => T8;
1011
- export function pipe<V0, T1, T2, T3, T4, T5, T6, T7, T8>(
1012
- fn0: (x: V0) => T1,
1013
- fn1: (x: T1) => T2,
1014
- fn2: (x: T2) => T3,
1015
- fn3: (x: T3) => T4,
1016
- fn4: (x: T4) => T5,
1017
- fn5: (x: T5) => T6,
1018
- fn6: (x: T6) => T7,
1019
- fn: (x: T7) => T8): (x: V0) => T8;
1020
- export function pipe<V0, V1, T1, T2, T3, T4, T5, T6, T7, T8>(
1021
- fn0: (x0: V0, x1: V1) => T1,
1022
- fn1: (x: T1) => T2,
1023
- fn2: (x: T2) => T3,
1024
- fn3: (x: T3) => T4,
1025
- fn4: (x: T4) => T5,
1026
- fn5: (x: T5) => T6,
1027
- fn6: (x: T6) => T7,
1028
- fn7: (x: T7) => T8): (x0: V0, x1: V1) => T8;
1029
- export function pipe<V0, V1, V2, T1, T2, T3, T4, T5, T6, T7, T8>(
1030
- fn0: (x0: V0, x1: V1, x2: V2) => T1,
1031
- fn1: (x: T1) => T2,
1032
- fn2: (x: T2) => T3,
1033
- fn3: (x: T3) => T4,
1034
- fn4: (x: T4) => T5,
1035
- fn5: (x: T5) => T6,
1036
- fn6: (x: T6) => T7,
1037
- fn7: (x: T7) => T8): (x0: V0, x1: V1, x2: V2) => T8;
1038
-
1039
- export function pipe<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
1040
- fn0: () => T1,
1041
- fn1: (x: T1) => T2,
1042
- fn2: (x: T2) => T3,
1043
- fn3: (x: T3) => T4,
1044
- fn4: (x: T4) => T5,
1045
- fn5: (x: T5) => T6,
1046
- fn6: (x: T6) => T7,
1047
- fn7: (x: T7) => T8,
1048
- fn8: (x: T8) => T9): () => T9;
1049
- export function pipe<V0, T1, T2, T3, T4, T5, T6, T7, T8, T9>(
1050
- fn0: (x0: V0) => T1,
1051
- fn1: (x: T1) => T2,
1052
- fn2: (x: T2) => T3,
1053
- fn3: (x: T3) => T4,
1054
- fn4: (x: T4) => T5,
1055
- fn5: (x: T5) => T6,
1056
- fn6: (x: T6) => T7,
1057
- fn7: (x: T7) => T8,
1058
- fn8: (x: T8) => T9): (x0: V0) => T9;
1059
- export function pipe<V0, V1, T1, T2, T3, T4, T5, T6, T7, T8, T9>(
1060
- fn0: (x0: V0, x1: V1) => T1,
1061
- fn1: (x: T1) => T2,
1062
- fn2: (x: T2) => T3,
1063
- fn3: (x: T3) => T4,
1064
- fn4: (x: T4) => T5,
1065
- fn5: (x: T5) => T6,
1066
- fn6: (x: T6) => T7,
1067
- fn7: (x: T7) => T8,
1068
- fn8: (x: T8) => T9): (x0: V0, x1: V1) => T9;
1069
- export function pipe<V0, V1, V2, T1, T2, T3, T4, T5, T6, T7, T8, T9>(
1070
- fn0: (x0: V0, x1: V1, x2: V2) => T1,
1071
- fn1: (x: T1) => T2,
1072
- fn2: (x: T2) => T3,
1073
- fn3: (x: T3) => T4,
1074
- fn4: (x: T4) => T5,
1075
- fn5: (x: T5) => T6,
1076
- fn6: (x: T6) => T7,
1077
- fn7: (x: T7) => T8,
1078
- fn8: (x: T8) => T9): (x0: V0, x1: V1, x2: V2) => T9;
1079
-
1080
- export function pipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(
1081
- fn0: () => T1,
1082
- fn1: (x: T1) => T2,
1083
- fn2: (x: T2) => T3,
1084
- fn3: (x: T3) => T4,
1085
- fn4: (x: T4) => T5,
1086
- fn5: (x: T5) => T6,
1087
- fn6: (x: T6) => T7,
1088
- fn7: (x: T7) => T8,
1089
- fn8: (x: T8) => T9,
1090
- fn9: (x: T9) => T10): () => T10;
1091
- export function pipe<V0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(
1092
- fn0: (x0: V0) => T1,
1093
- fn1: (x: T1) => T2,
1094
- fn2: (x: T2) => T3,
1095
- fn3: (x: T3) => T4,
1096
- fn4: (x: T4) => T5,
1097
- fn5: (x: T5) => T6,
1098
- fn6: (x: T6) => T7,
1099
- fn7: (x: T7) => T8,
1100
- fn8: (x: T8) => T9,
1101
- fn9: (x: T9) => T10): (x0: V0) => T10;
1102
- export function pipe<V0, V1, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(
1103
- fn0: (x0: V0, x1: V1) => T1,
1104
- fn1: (x: T1) => T2,
1105
- fn2: (x: T2) => T3,
1106
- fn3: (x: T3) => T4,
1107
- fn4: (x: T4) => T5,
1108
- fn5: (x: T5) => T6,
1109
- fn6: (x: T6) => T7,
1110
- fn7: (x: T7) => T8,
1111
- fn8: (x: T8) => T9,
1112
- fn9: (x: T9) => T10): (x0: V0, x1: V1) => T10;
1113
- export function pipe<V0, V1, V2, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(
1114
- fn0: (x0: V0, x1: V1, x2: V2) => T1,
1115
- fn1: (x: T1) => T2,
1116
- fn2: (x: T2) => T3,
1117
- fn3: (x: T3) => T4,
1118
- fn4: (x: T4) => T5,
1119
- fn5: (x: T5) => T6,
1120
- fn6: (x: T6) => T7,
1121
- fn7: (x: T7) => T8,
1122
- fn8: (x: T8) => T9,
1123
- fn9: (x: T9) => T10): (x0: V0, x1: V1, x2: V2) => T10;
962
+ export function pipe<TArgs extends any[], R1, R2, R3, R4, R5, R6, R7, TResult>(
963
+ ...funcs: [
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: Array<(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 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 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 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 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 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 any[], R1, R2>(
1011
+ f1: (...args: TArgs) => R1,
1012
+ f2: (a: R1) => R2
1013
+ ): (...args: TArgs) => R2;
1014
+ export function pipe<TArgs extends any[], R1>(
1015
+ f1: (...args: TArgs) => R1
1016
+ ): (...args: TArgs) => R1;
1124
1017
 
1125
1018
  /**
1126
1019
  * It returns list of the values of `property` taken from the all objects inside `list`.
@@ -1160,11 +1053,17 @@ export function propEq<K extends string | number>(propToFind: K): {
1160
1053
  /**
1161
1054
  * It returns `true` if `property` of `obj` is from `target` type.
1162
1055
  */
1163
- export function propIs(type: any, name: string, obj: any): boolean;
1164
- export function propIs(type: any, name: string): (obj: any) => boolean;
1165
- export function propIs(type: any): {
1166
- (name: string, obj: any): boolean;
1167
- (name: string): (obj: any) => boolean;
1056
+ export function propIs<C extends (...args: 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: 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: 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: 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: 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: 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>>;
1168
1067
  };
1169
1068
 
1170
1069
  /**
@@ -1233,6 +1132,7 @@ export function sort<T>(sortFn: (a: T, b: T) => number): (list: T[]) => T[];
1233
1132
  * It returns copy of `list` sorted by `sortFn` function.
1234
1133
  */
1235
1134
  export function sortBy<T>(sortFn: (a: T) => Ord, list: T[]): T[];
1135
+ export function sortBy<T>(sortFn: (a: T) => Ord): (list: T[]) => T[];
1236
1136
  export function sortBy(sortFn: (a: any) => Ord): <T>(list: T[]) => T[];
1237
1137
 
1238
1138
  /**
@@ -1252,10 +1152,13 @@ export function splitEvery(sliceLength: number): {
1252
1152
  };
1253
1153
 
1254
1154
  /**
1255
- * 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.
1256
1157
  */
1257
1158
  export function startsWith(target: string, str: string): boolean;
1258
1159
  export function startsWith(target: string): (str: string) => boolean;
1160
+ export function startsWith<T>(target: T[], list: T[]): boolean;
1161
+ export function startsWith<T>(target: T[]): (list: T[]) => boolean;
1259
1162
 
1260
1163
  /**
1261
1164
  * Curried version of `x - y`
@@ -1323,16 +1226,19 @@ export function test(regExpression: RegExp, str: string): boolean;
1323
1226
  export function times<T>(fn: (i: number) => T, howMany: number): T[];
1324
1227
  export function times<T>(fn: (i: number) => T): (howMany: number) => T[];
1325
1228
 
1229
+ export function toLower<S extends string>(str: S): Lowercase<S>;
1326
1230
  export function toLower(str: string): string;
1327
1231
 
1232
+ export function toUpper<S extends string>(str: S): Uppercase<S>;
1328
1233
  export function toUpper(str: string): string;
1329
1234
 
1330
1235
  /**
1331
1236
  * It transforms an object to a list.
1332
1237
  */
1333
- export function toPairs<S>(obj: { [k: string]: S } | { [k: number]: S }): ([string, S])[];
1238
+ export function toPairs<O extends object, K extends Extract<keyof O, string | number>>(obj: O): Array<{ [key in K]: [`${key}`, O[key]] }[K]>;
1239
+ export function toPairs<S>(obj: Record<string | number, S>): Array<[string, S]>;
1334
1240
 
1335
- export function toString<T>(x: T): string;
1241
+ export function toString(x: unknown): string;
1336
1242
 
1337
1243
  export function transpose<T>(list: (T[])[]): (T[])[];
1338
1244
 
@@ -1393,8 +1299,10 @@ export function uniqWith<T, U>(predicate: (x: T, y: T) => boolean): (list: T[])
1393
1299
  *
1394
1300
  * In the other case, the final output will be the `input` itself.
1395
1301
  */
1396
- export function unless<T, U>(predicate: (x: T) => boolean, whenFalseFn: (x: T) => U, obj: T): U;
1397
- 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;
1398
1306
 
1399
1307
  /**
1400
1308
  * It returns a copy of `list` with updated element at `index` with `newValue`.
@@ -1413,8 +1321,6 @@ export function when<T, U>(predicate: (x: T) => boolean): ((whenTrueFn: (a: T) =
1413
1321
 
1414
1322
  /**
1415
1323
  * It returns `true` if all each property in `conditions` returns `true` when applied to corresponding property in `input` object.
1416
- *
1417
- * `R.equals` is used to determine equality.
1418
1324
  */
1419
1325
  export function where<T, U>(conditions: T, input: U): boolean;
1420
1326
  export function where<T>(conditions: T): <U>(input: U) => boolean;
@@ -1530,3 +1436,24 @@ export function takeWhile<T>(fn: Predicate<T>): (iterable: T[]) => T[];
1530
1436
  export function eqProps<T, U>(prop: string, obj1: T, obj2: U): boolean;
1531
1437
  export function eqProps<P extends string>(prop: P): <T, U>(obj1: Record<P, T>, obj2: Record<P, U>) => boolean;
1532
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: any[]) => T): (...args: 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: any[]) => T, args: any[]): T;
1453
+ export function apply<T = any>(fn: (...args: any[]) => T): (args: any[]) => T;
1454
+
1455
+ /**
1456
+ * Creates a function that is bound to a context.
1457
+ */
1458
+ export function bind<F extends (...args: any[]) => any, T>(fn: F, thisObj: T): (...args: Parameters<F>) => ReturnType<F>;
1459
+ export function bind<F extends (...args: any[]) => any, T>(fn: F): (thisObj: T) => (...args: Parameters<F>) => ReturnType<F>;