版博士V2.0程序
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

486 строки
13 KiB

  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.fromArray = exports.getDifferenceMagma = exports.getIntersectionSemigroup = exports.getUnionMonoid = exports.getUnionSemigroup = exports.getEq = exports.getShow = exports.URI = exports.toReadonlyArray = exports.elem = exports.isSubset = exports.every = exports.some = exports.size = exports.isEmpty = exports.empty = exports.filterMap = exports.separate = exports.compact = exports.toggle = exports.remove = exports.insert = exports.reduceRight = exports.foldMap = exports.reduce = exports.difference = exports.partitionMap = exports.intersection = exports.union = exports.partition = exports.filter = exports.chain = exports.map = exports.toSet = exports.fromReadonlyArray = exports.singleton = exports.fromSet = void 0;
  4. var Eq_1 = require("./Eq");
  5. var function_1 = require("./function");
  6. var Predicate_1 = require("./Predicate");
  7. var Separated_1 = require("./Separated");
  8. /**
  9. * @category conversions
  10. * @since 2.5.0
  11. */
  12. var fromSet = function (s) { return new Set(s); };
  13. exports.fromSet = fromSet;
  14. // -------------------------------------------------------------------------------------
  15. // constructors
  16. // -------------------------------------------------------------------------------------
  17. /**
  18. * Create a set with one element
  19. *
  20. * @category constructors
  21. * @since 2.5.0
  22. */
  23. var singleton = function (a) { return new Set([a]); };
  24. exports.singleton = singleton;
  25. /**
  26. * Create a `ReadonlySet` from a `ReadonlyArray`
  27. *
  28. * @category conversions
  29. * @since 2.10.0
  30. */
  31. var fromReadonlyArray = function (E) {
  32. return function (as) {
  33. var len = as.length;
  34. var out = new Set();
  35. var has = elem(E);
  36. for (var i = 0; i < len; i++) {
  37. var a = as[i];
  38. if (!has(a, out)) {
  39. out.add(a);
  40. }
  41. }
  42. return out;
  43. };
  44. };
  45. exports.fromReadonlyArray = fromReadonlyArray;
  46. /**
  47. * @category conversions
  48. * @since 2.5.0
  49. */
  50. function toSet(s) {
  51. return new Set(s);
  52. }
  53. exports.toSet = toSet;
  54. /**
  55. * Projects a Set through a function
  56. *
  57. * @since 2.5.0
  58. */
  59. function map(E) {
  60. var elemE = elem(E);
  61. return function (f) { return function (set) {
  62. var r = new Set();
  63. set.forEach(function (e) {
  64. var v = f(e);
  65. if (!elemE(v, r)) {
  66. r.add(v);
  67. }
  68. });
  69. return r;
  70. }; };
  71. }
  72. exports.map = map;
  73. /**
  74. * @since 2.5.0
  75. */
  76. function chain(E) {
  77. var elemE = elem(E);
  78. return function (f) { return function (set) {
  79. var r = new Set();
  80. set.forEach(function (e) {
  81. f(e).forEach(function (e) {
  82. if (!elemE(e, r)) {
  83. r.add(e);
  84. }
  85. });
  86. });
  87. return r;
  88. }; };
  89. }
  90. exports.chain = chain;
  91. function filter(predicate) {
  92. return function (set) {
  93. var values = set.values();
  94. var e;
  95. var r = new Set();
  96. while (!(e = values.next()).done) {
  97. var a = e.value;
  98. if (predicate(a)) {
  99. r.add(a);
  100. }
  101. }
  102. return r;
  103. };
  104. }
  105. exports.filter = filter;
  106. function partition(predicate) {
  107. return function (set) {
  108. var values = set.values();
  109. var e;
  110. var right = new Set();
  111. var left = new Set();
  112. while (!(e = values.next()).done) {
  113. var a = e.value;
  114. if (predicate(a)) {
  115. right.add(a);
  116. }
  117. else {
  118. left.add(a);
  119. }
  120. }
  121. return (0, Separated_1.separated)(left, right);
  122. };
  123. }
  124. exports.partition = partition;
  125. function union(E) {
  126. var elemE = elem(E);
  127. return function (me, that) {
  128. if (that === undefined) {
  129. var unionE_1 = union(E);
  130. return function (that) { return unionE_1(me, that); };
  131. }
  132. if ((0, exports.isEmpty)(me)) {
  133. return that;
  134. }
  135. if ((0, exports.isEmpty)(that)) {
  136. return me;
  137. }
  138. var r = new Set(me);
  139. that.forEach(function (e) {
  140. if (!elemE(e, r)) {
  141. r.add(e);
  142. }
  143. });
  144. return r;
  145. };
  146. }
  147. exports.union = union;
  148. function intersection(E) {
  149. var elemE = elem(E);
  150. return function (me, that) {
  151. if (that === undefined) {
  152. var intersectionE_1 = intersection(E);
  153. return function (that) { return intersectionE_1(that, me); };
  154. }
  155. if ((0, exports.isEmpty)(me) || (0, exports.isEmpty)(that)) {
  156. return exports.empty;
  157. }
  158. var r = new Set();
  159. me.forEach(function (e) {
  160. if (elemE(e, that)) {
  161. r.add(e);
  162. }
  163. });
  164. return r;
  165. };
  166. }
  167. exports.intersection = intersection;
  168. /**
  169. * @since 2.5.0
  170. */
  171. function partitionMap(EB, EC) {
  172. return function (f) {
  173. return function (set) {
  174. var values = set.values();
  175. var e;
  176. var left = new Set();
  177. var right = new Set();
  178. var hasB = elem(EB);
  179. var hasC = elem(EC);
  180. while (!(e = values.next()).done) {
  181. var v = f(e.value);
  182. switch (v._tag) {
  183. case 'Left':
  184. if (!hasB(v.left, left)) {
  185. left.add(v.left);
  186. }
  187. break;
  188. case 'Right':
  189. if (!hasC(v.right, right)) {
  190. right.add(v.right);
  191. }
  192. break;
  193. }
  194. }
  195. return (0, Separated_1.separated)(left, right);
  196. };
  197. };
  198. }
  199. exports.partitionMap = partitionMap;
  200. function difference(E) {
  201. var elemE = elem(E);
  202. return function (me, that) {
  203. if (that === undefined) {
  204. var differenceE_1 = difference(E);
  205. return function (that) { return differenceE_1(that, me); };
  206. }
  207. return filter(function (a) { return !elemE(a, that); })(me);
  208. };
  209. }
  210. exports.difference = difference;
  211. /**
  212. * @since 2.5.0
  213. */
  214. function reduce(O) {
  215. var toReadonlyArrayO = (0, exports.toReadonlyArray)(O);
  216. return function (b, f) { return function (fa) { return toReadonlyArrayO(fa).reduce(f, b); }; };
  217. }
  218. exports.reduce = reduce;
  219. /**
  220. * @since 2.5.0
  221. */
  222. function foldMap(O, M) {
  223. var toReadonlyArrayO = (0, exports.toReadonlyArray)(O);
  224. return function (f) { return function (fa) { return toReadonlyArrayO(fa).reduce(function (b, a) { return M.concat(b, f(a)); }, M.empty); }; };
  225. }
  226. exports.foldMap = foldMap;
  227. /**
  228. * @category folding
  229. * @since 2.11.0
  230. */
  231. var reduceRight = function (O) {
  232. var toReadonlyArrayO = (0, exports.toReadonlyArray)(O);
  233. return function (b, f) { return function (fa) { return toReadonlyArrayO(fa).reduceRight(function (b, a) { return f(a, b); }, b); }; };
  234. };
  235. exports.reduceRight = reduceRight;
  236. /**
  237. * Insert a value into a set
  238. *
  239. * @since 2.5.0
  240. */
  241. function insert(E) {
  242. var elemE = elem(E);
  243. return function (a) { return function (set) {
  244. if (!elemE(a)(set)) {
  245. var r = new Set(set);
  246. r.add(a);
  247. return r;
  248. }
  249. else {
  250. return set;
  251. }
  252. }; };
  253. }
  254. exports.insert = insert;
  255. /**
  256. * Delete a value from a set
  257. *
  258. * @since 2.5.0
  259. */
  260. var remove = function (E) {
  261. return function (a) {
  262. return function (set) {
  263. return filter(function (ax) { return !E.equals(a, ax); })(set);
  264. };
  265. };
  266. };
  267. exports.remove = remove;
  268. /**
  269. * Checks an element is a member of a set;
  270. * If yes, removes the value from the set
  271. * If no, inserts the value to the set
  272. *
  273. * @since 2.10.0
  274. */
  275. var toggle = function (E) {
  276. var elemE = elem(E);
  277. var removeE = (0, exports.remove)(E);
  278. var insertE = insert(E);
  279. return function (a) { return function (set) { return (elemE(a, set) ? removeE : insertE)(a)(set); }; };
  280. };
  281. exports.toggle = toggle;
  282. /**
  283. * @since 2.5.0
  284. */
  285. var compact = function (E) { return filterMap(E)(function_1.identity); };
  286. exports.compact = compact;
  287. /**
  288. * @since 2.5.0
  289. */
  290. function separate(EE, EA) {
  291. return function (fa) {
  292. var elemEE = elem(EE);
  293. var elemEA = elem(EA);
  294. var left = new Set();
  295. var right = new Set();
  296. fa.forEach(function (e) {
  297. switch (e._tag) {
  298. case 'Left':
  299. if (!elemEE(e.left, left)) {
  300. left.add(e.left);
  301. }
  302. break;
  303. case 'Right':
  304. if (!elemEA(e.right, right)) {
  305. right.add(e.right);
  306. }
  307. break;
  308. }
  309. });
  310. return (0, Separated_1.separated)(left, right);
  311. };
  312. }
  313. exports.separate = separate;
  314. /**
  315. * @since 2.5.0
  316. */
  317. function filterMap(E) {
  318. var elemE = elem(E);
  319. return function (f) { return function (fa) {
  320. var r = new Set();
  321. fa.forEach(function (a) {
  322. var ob = f(a);
  323. if (ob._tag === 'Some' && !elemE(ob.value, r)) {
  324. r.add(ob.value);
  325. }
  326. });
  327. return r;
  328. }; };
  329. }
  330. exports.filterMap = filterMap;
  331. // -------------------------------------------------------------------------------------
  332. // utils
  333. // -------------------------------------------------------------------------------------
  334. /**
  335. * @since 2.5.0
  336. */
  337. exports.empty = new Set();
  338. /**
  339. * Test whether a `ReadonlySet` is empty.
  340. *
  341. * @since 2.10.0
  342. */
  343. var isEmpty = function (set) { return set.size === 0; };
  344. exports.isEmpty = isEmpty;
  345. /**
  346. * Calculate the number of elements in a `ReadonlySet`.
  347. *
  348. * @since 2.10.0
  349. */
  350. var size = function (set) { return set.size; };
  351. exports.size = size;
  352. /**
  353. * @since 2.5.0
  354. */
  355. var some = function (predicate) {
  356. return function (set) {
  357. var values = set.values();
  358. var e;
  359. var found = false;
  360. while (!found && !(e = values.next()).done) {
  361. found = predicate(e.value);
  362. }
  363. return found;
  364. };
  365. };
  366. exports.some = some;
  367. function every(predicate) {
  368. return (0, Predicate_1.not)((0, exports.some)((0, Predicate_1.not)(predicate)));
  369. }
  370. exports.every = every;
  371. function isSubset(E) {
  372. var elemE = elem(E);
  373. return function (me, that) {
  374. if (that === undefined) {
  375. var isSubsetE_1 = isSubset(E);
  376. return function (that) { return isSubsetE_1(that, me); };
  377. }
  378. return every(function (a) { return elemE(a, that); })(me);
  379. };
  380. }
  381. exports.isSubset = isSubset;
  382. function elem(E) {
  383. return function (a, set) {
  384. if (set === undefined) {
  385. var elemE_1 = elem(E);
  386. return function (set) { return elemE_1(a, set); };
  387. }
  388. var values = set.values();
  389. var e;
  390. var found = false;
  391. while (!found && !(e = values.next()).done) {
  392. found = E.equals(a, e.value);
  393. }
  394. return found;
  395. };
  396. }
  397. exports.elem = elem;
  398. /**
  399. * Get a sorted `ReadonlyArray` of the values contained in a `ReadonlySet`.
  400. *
  401. * @category conversions
  402. * @since 2.5.0
  403. */
  404. var toReadonlyArray = function (O) {
  405. return function (set) {
  406. var out = [];
  407. set.forEach(function (e) { return out.push(e); });
  408. return out.sort(O.compare);
  409. };
  410. };
  411. exports.toReadonlyArray = toReadonlyArray;
  412. /**
  413. * @category type lambdas
  414. * @since 2.11.0
  415. */
  416. exports.URI = 'ReadonlySet';
  417. /**
  418. * @category instances
  419. * @since 2.5.0
  420. */
  421. function getShow(S) {
  422. return {
  423. show: function (s) {
  424. var entries = [];
  425. s.forEach(function (a) {
  426. entries.push(S.show(a));
  427. });
  428. return "new Set([".concat(entries.sort().join(', '), "])");
  429. }
  430. };
  431. }
  432. exports.getShow = getShow;
  433. /**
  434. * @category instances
  435. * @since 2.5.0
  436. */
  437. function getEq(E) {
  438. var subsetE = isSubset(E);
  439. return (0, Eq_1.fromEquals)(function (x, y) { return subsetE(x, y) && subsetE(y, x); });
  440. }
  441. exports.getEq = getEq;
  442. /**
  443. * @category instances
  444. * @since 2.11.0
  445. */
  446. var getUnionSemigroup = function (E) { return ({
  447. concat: union(E)
  448. }); };
  449. exports.getUnionSemigroup = getUnionSemigroup;
  450. /**
  451. * @category instances
  452. * @since 2.5.0
  453. */
  454. var getUnionMonoid = function (E) { return ({
  455. concat: (0, exports.getUnionSemigroup)(E).concat,
  456. empty: exports.empty
  457. }); };
  458. exports.getUnionMonoid = getUnionMonoid;
  459. /**
  460. * @category instances
  461. * @since 2.5.0
  462. */
  463. var getIntersectionSemigroup = function (E) { return ({
  464. concat: intersection(E)
  465. }); };
  466. exports.getIntersectionSemigroup = getIntersectionSemigroup;
  467. /**
  468. * @category instances
  469. * @since 2.11.0
  470. */
  471. var getDifferenceMagma = function (E) { return ({
  472. concat: difference(E)
  473. }); };
  474. exports.getDifferenceMagma = getDifferenceMagma;
  475. // -------------------------------------------------------------------------------------
  476. // deprecated
  477. // -------------------------------------------------------------------------------------
  478. /**
  479. * Use [`fromReadonlyArray`](#fromreadonlyarray) instead.
  480. *
  481. * @category zone of death
  482. * @since 2.5.0
  483. * @deprecated
  484. */
  485. exports.fromArray = exports.fromReadonlyArray;