版博士V2.0程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

388 lines
9.1 KiB

  1. import { identity } from './function';
  2. import * as RS from './ReadonlySet';
  3. import { separated } from './Separated';
  4. /**
  5. * @category instances
  6. * @since 2.0.0
  7. */
  8. export var getShow = RS.getShow;
  9. /**
  10. * @category instances
  11. * @since 2.0.0
  12. */
  13. export var getEq = RS.getEq;
  14. /**
  15. * `map` can be used to turn functions `(a: A) => B` into functions `(fa: F<A>) => F<B>` whose argument and return types
  16. * use the type constructor `F` to represent some computational context.
  17. *
  18. * @since 2.0.0
  19. */
  20. export function map(E) {
  21. var elemE = elem(E);
  22. return function (f) { return function (set) {
  23. var r = new Set();
  24. set.forEach(function (e) {
  25. var v = f(e);
  26. if (!elemE(v, r)) {
  27. r.add(v);
  28. }
  29. });
  30. return r;
  31. }; };
  32. }
  33. /**
  34. * Composes computations in sequence, using the return value of one computation to determine the next computation.
  35. *
  36. * @since 2.0.0
  37. */
  38. export function chain(E) {
  39. var elemE = elem(E);
  40. return function (f) { return function (set) {
  41. var r = new Set();
  42. set.forEach(function (e) {
  43. f(e).forEach(function (e) {
  44. if (!elemE(e, r)) {
  45. r.add(e);
  46. }
  47. });
  48. });
  49. return r;
  50. }; };
  51. }
  52. export function filter(predicate) {
  53. return function (set) {
  54. var values = set.values();
  55. var e;
  56. var r = new Set();
  57. while (!(e = values.next()).done) {
  58. var a = e.value;
  59. if (predicate(a)) {
  60. r.add(a);
  61. }
  62. }
  63. return r;
  64. };
  65. }
  66. export function partition(predicate) {
  67. return function (set) {
  68. var values = set.values();
  69. var e;
  70. var right = new Set();
  71. var left = new Set();
  72. while (!(e = values.next()).done) {
  73. var a = e.value;
  74. if (predicate(a)) {
  75. right.add(a);
  76. }
  77. else {
  78. left.add(a);
  79. }
  80. }
  81. return separated(left, right);
  82. };
  83. }
  84. export function union(E) {
  85. var elemE = elem(E);
  86. return function (me, that) {
  87. if (that === undefined) {
  88. var unionE_1 = union(E);
  89. return function (that) { return unionE_1(me, that); };
  90. }
  91. if (isEmpty(me)) {
  92. return that;
  93. }
  94. if (isEmpty(that)) {
  95. return me;
  96. }
  97. var r = new Set(me);
  98. that.forEach(function (e) {
  99. if (!elemE(e, r)) {
  100. r.add(e);
  101. }
  102. });
  103. return r;
  104. };
  105. }
  106. export function intersection(E) {
  107. var elemE = elem(E);
  108. return function (me, that) {
  109. if (that === undefined) {
  110. var intersectionE_1 = intersection(E);
  111. return function (that) { return intersectionE_1(that, me); };
  112. }
  113. if (isEmpty(me) || isEmpty(that)) {
  114. return new Set();
  115. }
  116. var r = new Set();
  117. me.forEach(function (e) {
  118. if (elemE(e, that)) {
  119. r.add(e);
  120. }
  121. });
  122. return r;
  123. };
  124. }
  125. /**
  126. * @since 2.0.0
  127. */
  128. export function partitionMap(EB, EC) {
  129. return function (f) {
  130. return function (set) {
  131. var values = set.values();
  132. var e;
  133. var left = new Set();
  134. var right = new Set();
  135. var hasB = elem(EB);
  136. var hasC = elem(EC);
  137. while (!(e = values.next()).done) {
  138. var v = f(e.value);
  139. switch (v._tag) {
  140. case 'Left':
  141. if (!hasB(v.left, left)) {
  142. left.add(v.left);
  143. }
  144. break;
  145. case 'Right':
  146. if (!hasC(v.right, right)) {
  147. right.add(v.right);
  148. }
  149. break;
  150. }
  151. }
  152. return separated(left, right);
  153. };
  154. };
  155. }
  156. export function difference(E) {
  157. var elemE = elem(E);
  158. return function (me, that) {
  159. if (that === undefined) {
  160. var differenceE_1 = difference(E);
  161. return function (that) { return differenceE_1(that, me); };
  162. }
  163. return filter(function (a) { return !elemE(a, that); })(me);
  164. };
  165. }
  166. /**
  167. * @category instances
  168. * @since 2.11.0
  169. */
  170. export var getUnionSemigroup = function (E) { return ({
  171. concat: union(E)
  172. }); };
  173. /**
  174. * @category instances
  175. * @since 2.0.0
  176. */
  177. export var getUnionMonoid = function (E) { return ({
  178. concat: getUnionSemigroup(E).concat,
  179. empty: new Set()
  180. }); };
  181. /**
  182. * @category instances
  183. * @since 2.0.0
  184. */
  185. export var getIntersectionSemigroup = function (E) { return ({
  186. concat: intersection(E)
  187. }); };
  188. /**
  189. * @category instances
  190. * @since 2.11.0
  191. */
  192. export var getDifferenceMagma = function (E) { return ({
  193. concat: difference(E)
  194. }); };
  195. /**
  196. * @category folding
  197. * @since 2.0.0
  198. */
  199. export var reduce = RS.reduce;
  200. /**
  201. * @category folding
  202. * @since 2.0.0
  203. */
  204. export var foldMap = RS.foldMap;
  205. /**
  206. * @category folding
  207. * @since 2.11.0
  208. */
  209. export var reduceRight = RS.reduceRight;
  210. /**
  211. * Create a set with one element
  212. *
  213. * @category constructors
  214. * @since 2.0.0
  215. */
  216. export var singleton = function (a) { return new Set([a]); };
  217. /**
  218. * Insert a value into a set
  219. *
  220. * @since 2.0.0
  221. */
  222. export function insert(E) {
  223. var elemE = elem(E);
  224. return function (a) { return function (set) {
  225. if (!elemE(a)(set)) {
  226. var r = new Set(set);
  227. r.add(a);
  228. return r;
  229. }
  230. else {
  231. return set;
  232. }
  233. }; };
  234. }
  235. /**
  236. * Delete a value from a set
  237. *
  238. * @since 2.0.0
  239. */
  240. export var remove = function (E) {
  241. return function (a) {
  242. return function (set) {
  243. return filter(function (ax) { return !E.equals(a, ax); })(set);
  244. };
  245. };
  246. };
  247. /**
  248. * Checks an element is a member of a set;
  249. * If yes, removes the value from the set
  250. * If no, inserts the value to the set
  251. *
  252. * @since 2.5.0
  253. */
  254. export var toggle = function (E) {
  255. var elemE = elem(E);
  256. var removeE = remove(E);
  257. var insertE = insert(E);
  258. return function (a) { return function (set) { return (elemE(a, set) ? removeE : insertE)(a)(set); }; };
  259. };
  260. /**
  261. * Create a set from an array
  262. *
  263. * @category conversions
  264. * @since 2.0.0
  265. */
  266. export var fromArray = function (E) {
  267. return function (as) {
  268. var len = as.length;
  269. var out = new Set();
  270. var has = elem(E);
  271. for (var i = 0; i < len; i++) {
  272. var a = as[i];
  273. if (!has(a, out)) {
  274. out.add(a);
  275. }
  276. }
  277. return out;
  278. };
  279. };
  280. /**
  281. * @since 2.0.0
  282. */
  283. export var compact = function (E) { return filterMap(E)(identity); };
  284. /**
  285. * @since 2.0.0
  286. */
  287. export function separate(EE, EA) {
  288. return function (fa) {
  289. var elemEE = elem(EE);
  290. var elemEA = elem(EA);
  291. var left = new Set();
  292. var right = new Set();
  293. fa.forEach(function (e) {
  294. switch (e._tag) {
  295. case 'Left':
  296. if (!elemEE(e.left, left)) {
  297. left.add(e.left);
  298. }
  299. break;
  300. case 'Right':
  301. if (!elemEA(e.right, right)) {
  302. right.add(e.right);
  303. }
  304. break;
  305. }
  306. });
  307. return separated(left, right);
  308. };
  309. }
  310. /**
  311. * @since 2.0.0
  312. */
  313. export function filterMap(E) {
  314. var elemE = elem(E);
  315. return function (f) { return function (fa) {
  316. var r = new Set();
  317. fa.forEach(function (a) {
  318. var ob = f(a);
  319. if (ob._tag === 'Some' && !elemE(ob.value, r)) {
  320. r.add(ob.value);
  321. }
  322. });
  323. return r;
  324. }; };
  325. }
  326. // -------------------------------------------------------------------------------------
  327. // utils
  328. // -------------------------------------------------------------------------------------
  329. /**
  330. * @since 2.0.0
  331. */
  332. export var empty = new Set();
  333. /**
  334. * Test whether a `Set` is empty.
  335. *
  336. * @since 2.10.0
  337. */
  338. export var isEmpty = function (set) { return set.size === 0; };
  339. /**
  340. * Calculate the number of elements in a `Set`.
  341. *
  342. * @since 2.10.0
  343. */
  344. export var size = function (set) { return set.size; };
  345. /**
  346. * @since 2.0.0
  347. */
  348. export var some = RS.some;
  349. /**
  350. * @since 2.0.0
  351. */
  352. export var every = RS.every;
  353. /**
  354. * @since 2.10.0
  355. */
  356. export var isSubset = RS.isSubset;
  357. // TODO: remove non-curried overloading in v3
  358. /**
  359. * Test if a value is a member of a set
  360. *
  361. * @since 2.0.0
  362. */
  363. export var elem = RS.elem;
  364. /**
  365. * Get a sorted `Array` of the values contained in a `Set`.
  366. *
  367. * @category conversions
  368. * @since 2.0.0
  369. */
  370. export var toArray = function (O) {
  371. return function (set) {
  372. var out = [];
  373. set.forEach(function (e) { return out.push(e); });
  374. return out.sort(O.compare);
  375. };
  376. };
  377. // -------------------------------------------------------------------------------------
  378. // deprecated
  379. // -------------------------------------------------------------------------------------
  380. /**
  381. * Use [`isSubset`](#issubset) instead.
  382. *
  383. * @category zone of death
  384. * @since 2.0.0
  385. * @deprecated
  386. */
  387. export var subset = RS.isSubset;