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

449 строки
11 KiB

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