版博士V2.0程序
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

Set.js 12 KiB

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