版博士V2.0程序
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 

215 satır
5.6 KiB

  1. import { pipe } from './function';
  2. // -------------------------------------------------------------------------------------
  3. // constructors
  4. // -------------------------------------------------------------------------------------
  5. /**
  6. * @category constructors
  7. * @since 2.0.0
  8. */
  9. export var fromEquals = function (equals) { return ({
  10. equals: function (x, y) { return x === y || equals(x, y); }
  11. }); };
  12. // -------------------------------------------------------------------------------------
  13. // combinators
  14. // -------------------------------------------------------------------------------------
  15. /**
  16. * @since 2.10.0
  17. */
  18. export var struct = function (eqs) {
  19. return fromEquals(function (first, second) {
  20. for (var key in eqs) {
  21. if (!eqs[key].equals(first[key], second[key])) {
  22. return false;
  23. }
  24. }
  25. return true;
  26. });
  27. };
  28. /**
  29. * Given a tuple of `Eq`s returns a `Eq` for the tuple
  30. *
  31. * @example
  32. * import { tuple } from 'fp-ts/Eq'
  33. * import * as S from 'fp-ts/string'
  34. * import * as N from 'fp-ts/number'
  35. * import * as B from 'fp-ts/boolean'
  36. *
  37. * const E = tuple(S.Eq, N.Eq, B.Eq)
  38. * assert.strictEqual(E.equals(['a', 1, true], ['a', 1, true]), true)
  39. * assert.strictEqual(E.equals(['a', 1, true], ['b', 1, true]), false)
  40. * assert.strictEqual(E.equals(['a', 1, true], ['a', 2, true]), false)
  41. * assert.strictEqual(E.equals(['a', 1, true], ['a', 1, false]), false)
  42. *
  43. * @since 2.10.0
  44. */
  45. export var tuple = function () {
  46. var eqs = [];
  47. for (var _i = 0; _i < arguments.length; _i++) {
  48. eqs[_i] = arguments[_i];
  49. }
  50. return fromEquals(function (first, second) { return eqs.every(function (E, i) { return E.equals(first[i], second[i]); }); });
  51. };
  52. /* istanbul ignore next */
  53. var contramap_ = function (fa, f) { return pipe(fa, contramap(f)); };
  54. /**
  55. * A typical use case for `contramap` would be like, given some `User` type, to construct an `Eq<User>`.
  56. *
  57. * We can do so with a function from `User -> X` where `X` is some value that we know how to compare
  58. * for equality (meaning we have an `Eq<X>`)
  59. *
  60. * For example, given the following `User` type, we want to construct an `Eq<User>` that just looks at the `key` field
  61. * for each user (since it's known to be unique).
  62. *
  63. * If we have a way of comparing `UUID`s for equality (`eqUUID: Eq<UUID>`) and we know how to go from `User -> UUID`,
  64. * using `contramap` we can do this
  65. *
  66. * @example
  67. * import { contramap, Eq } from 'fp-ts/Eq'
  68. * import { pipe } from 'fp-ts/function'
  69. * import * as S from 'fp-ts/string'
  70. *
  71. * type UUID = string
  72. *
  73. * interface User {
  74. * readonly key: UUID
  75. * readonly firstName: string
  76. * readonly lastName: string
  77. * }
  78. *
  79. * const eqUUID: Eq<UUID> = S.Eq
  80. *
  81. * const eqUserByKey: Eq<User> = pipe(
  82. * eqUUID,
  83. * contramap((user) => user.key)
  84. * )
  85. *
  86. * assert.deepStrictEqual(
  87. * eqUserByKey.equals(
  88. * { key: 'k1', firstName: 'a1', lastName: 'b1' },
  89. * { key: 'k2', firstName: 'a1', lastName: 'b1' }
  90. * ),
  91. * false
  92. * )
  93. * assert.deepStrictEqual(
  94. * eqUserByKey.equals(
  95. * { key: 'k1', firstName: 'a1', lastName: 'b1' },
  96. * { key: 'k1', firstName: 'a2', lastName: 'b1' }
  97. * ),
  98. * true
  99. * )
  100. *
  101. * @since 2.0.0
  102. */
  103. export var contramap = function (f) { return function (fa) {
  104. return fromEquals(function (x, y) { return fa.equals(f(x), f(y)); });
  105. }; };
  106. /**
  107. * @category type lambdas
  108. * @since 2.0.0
  109. */
  110. export var URI = 'Eq';
  111. /**
  112. * @category instances
  113. * @since 2.5.0
  114. */
  115. export var eqStrict = {
  116. equals: function (a, b) { return a === b; }
  117. };
  118. var empty = {
  119. equals: function () { return true; }
  120. };
  121. /**
  122. * @category instances
  123. * @since 2.10.0
  124. */
  125. export var getSemigroup = function () { return ({
  126. concat: function (x, y) { return fromEquals(function (a, b) { return x.equals(a, b) && y.equals(a, b); }); }
  127. }); };
  128. /**
  129. * @category instances
  130. * @since 2.6.0
  131. */
  132. export var getMonoid = function () { return ({
  133. concat: getSemigroup().concat,
  134. empty: empty
  135. }); };
  136. /**
  137. * @category instances
  138. * @since 2.7.0
  139. */
  140. export var Contravariant = {
  141. URI: URI,
  142. contramap: contramap_
  143. };
  144. // -------------------------------------------------------------------------------------
  145. // deprecated
  146. // -------------------------------------------------------------------------------------
  147. /**
  148. * Use [`tuple`](#tuple) instead.
  149. *
  150. * @category zone of death
  151. * @since 2.0.0
  152. * @deprecated
  153. */
  154. export var getTupleEq = tuple;
  155. /**
  156. * Use [`struct`](#struct) instead.
  157. *
  158. * @category zone of death
  159. * @since 2.0.0
  160. * @deprecated
  161. */
  162. export var getStructEq = struct;
  163. /**
  164. * Use [`eqStrict`](#eqstrict) instead
  165. *
  166. * @category zone of death
  167. * @since 2.0.0
  168. * @deprecated
  169. */
  170. export var strictEqual = eqStrict.equals;
  171. /**
  172. * This instance is deprecated, use small, specific instances instead.
  173. * For example if a function needs a `Contravariant` instance, pass `E.Contravariant` instead of `E.eq`
  174. * (where `E` is from `import E from 'fp-ts/Eq'`)
  175. *
  176. * @category zone of death
  177. * @since 2.0.0
  178. * @deprecated
  179. */
  180. export var eq = Contravariant;
  181. /**
  182. * Use [`Eq`](./boolean.ts.html#eq) instead.
  183. *
  184. * @category zone of death
  185. * @since 2.0.0
  186. * @deprecated
  187. */
  188. export var eqBoolean = eqStrict;
  189. /**
  190. * Use [`Eq`](./string.ts.html#eq) instead.
  191. *
  192. * @category zone of death
  193. * @since 2.0.0
  194. * @deprecated
  195. */
  196. export var eqString = eqStrict;
  197. /**
  198. * Use [`Eq`](./number.ts.html#eq) instead.
  199. *
  200. * @category zone of death
  201. * @since 2.0.0
  202. * @deprecated
  203. */
  204. export var eqNumber = eqStrict;
  205. /**
  206. * Use [`Eq`](./Date.ts.html#eq) instead.
  207. *
  208. * @category zone of death
  209. * @since 2.0.0
  210. * @deprecated
  211. */
  212. export var eqDate = {
  213. equals: function (first, second) { return first.valueOf() === second.valueOf(); }
  214. };