版博士V2.0程序
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 

751 lignes
19 KiB

  1. var __assign = (this && this.__assign) || function () {
  2. __assign = Object.assign || function(t) {
  3. for (var s, i = 1, n = arguments.length; i < n; i++) {
  4. s = arguments[i];
  5. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
  6. t[p] = s[p];
  7. }
  8. return t;
  9. };
  10. return __assign.apply(this, arguments);
  11. };
  12. import { pipe } from './function';
  13. import { flap as flap_ } from './Functor';
  14. import * as _ from './internal';
  15. import * as O from './Option';
  16. import * as RM from './ReadonlyMap';
  17. import { separated } from './Separated';
  18. import { wiltDefault, witherDefault } from './Witherable';
  19. /**
  20. * @category instances
  21. * @since 2.0.0
  22. */
  23. export var getShow = RM.getShow;
  24. /**
  25. * Calculate the number of key/value pairs in a map
  26. *
  27. * @since 2.0.0
  28. */
  29. export var size = RM.size;
  30. /**
  31. * Test whether or not a map is empty
  32. *
  33. * @since 2.0.0
  34. */
  35. export var isEmpty = RM.isEmpty;
  36. // TODO: remove non-curried overloading in v3
  37. /**
  38. * Test whether or not a key exists in a map
  39. *
  40. * @since 2.0.0
  41. */
  42. export var member = RM.member;
  43. // TODO: remove non-curried overloading in v3
  44. /**
  45. * Test whether or not a value is a member of a map
  46. *
  47. * @since 2.0.0
  48. */
  49. export var elem = RM.elem;
  50. /**
  51. * Get a sorted `Array` of the keys contained in a `Map`.
  52. *
  53. * @since 2.0.0
  54. */
  55. export var keys = function (O) {
  56. return function (m) {
  57. return Array.from(m.keys()).sort(O.compare);
  58. };
  59. };
  60. /**
  61. * Get a sorted `Array` of the values contained in a `Map`.
  62. *
  63. * @since 2.0.0
  64. */
  65. export var values = function (O) {
  66. return function (m) {
  67. return Array.from(m.values()).sort(O.compare);
  68. };
  69. };
  70. /**
  71. * @since 2.0.0
  72. */
  73. export function collect(O) {
  74. var keysO = keys(O);
  75. return function (f) {
  76. return function (m) {
  77. var out = [];
  78. var ks = keysO(m);
  79. for (var _i = 0, ks_1 = ks; _i < ks_1.length; _i++) {
  80. var key = ks_1[_i];
  81. out.push(f(key, m.get(key)));
  82. }
  83. return out;
  84. };
  85. };
  86. }
  87. /**
  88. * Get a sorted `Array` of the key/value pairs contained in a `Map`.
  89. *
  90. * @since 2.0.0
  91. */
  92. export function toArray(O) {
  93. return collect(O)(function (k, a) { return [k, a]; });
  94. }
  95. export function toUnfoldable(ord, U) {
  96. var toArrayO = toArray(ord);
  97. return function (d) {
  98. var kas = toArrayO(d);
  99. var len = kas.length;
  100. return U.unfold(0, function (b) { return (b < len ? _.some([kas[b], b + 1]) : _.none); });
  101. };
  102. }
  103. /**
  104. * Insert or replace a key/value pair in a `Map`.
  105. *
  106. * @since 2.0.0
  107. */
  108. export var upsertAt = function (E) {
  109. var lookupWithKeyE = lookupWithKey(E);
  110. return function (k, a) {
  111. var lookupWithKeyEk = lookupWithKeyE(k);
  112. return function (m) {
  113. var found = lookupWithKeyEk(m);
  114. if (_.isNone(found)) {
  115. var out = new Map(m);
  116. out.set(k, a);
  117. return out;
  118. }
  119. else if (found.value[1] !== a) {
  120. var out = new Map(m);
  121. out.set(found.value[0], a);
  122. return out;
  123. }
  124. return m;
  125. };
  126. };
  127. };
  128. /**
  129. * Delete a key and value from a map
  130. *
  131. * @since 2.0.0
  132. */
  133. export var deleteAt = function (E) {
  134. var lookupWithKeyE = lookupWithKey(E);
  135. return function (k) { return function (m) {
  136. var found = lookupWithKeyE(k, m);
  137. if (_.isSome(found)) {
  138. var r = new Map(m);
  139. r.delete(found.value[0]);
  140. return r;
  141. }
  142. return m;
  143. }; };
  144. };
  145. /**
  146. * @since 2.0.0
  147. */
  148. export var updateAt = function (E) {
  149. var modifyAtE = modifyAt(E);
  150. return function (k, a) { return modifyAtE(k, function () { return a; }); };
  151. };
  152. /**
  153. * @since 2.0.0
  154. */
  155. export var modifyAt = function (E) {
  156. var lookupWithKeyE = lookupWithKey(E);
  157. return function (k, f) { return function (m) {
  158. var found = lookupWithKeyE(k, m);
  159. if (_.isNone(found)) {
  160. return _.none;
  161. }
  162. var r = new Map(m);
  163. r.set(found.value[0], f(found.value[1]));
  164. return _.some(r);
  165. }; };
  166. };
  167. /**
  168. * Delete a key and value from a map, returning the value as well as the subsequent map
  169. *
  170. * @since 2.0.0
  171. */
  172. export function pop(E) {
  173. var lookupE = lookup(E);
  174. var deleteAtE = deleteAt(E);
  175. return function (k) {
  176. var deleteAtEk = deleteAtE(k);
  177. return function (m) {
  178. return pipe(lookupE(k, m), O.map(function (a) { return [a, deleteAtEk(m)]; }));
  179. };
  180. };
  181. }
  182. export function lookupWithKey(E) {
  183. return function (k, m) {
  184. if (m === undefined) {
  185. var lookupWithKeyE_1 = lookupWithKey(E);
  186. return function (m) { return lookupWithKeyE_1(k, m); };
  187. }
  188. var entries = m.entries();
  189. var e;
  190. while (!(e = entries.next()).done) {
  191. var _a = e.value, ka = _a[0], a = _a[1];
  192. if (E.equals(ka, k)) {
  193. return _.some([ka, a]);
  194. }
  195. }
  196. return _.none;
  197. };
  198. }
  199. // TODO: remove non-curried overloading in v3
  200. /**
  201. * Lookup the value for a key in a `Map`.
  202. *
  203. * @since 2.0.0
  204. */
  205. export var lookup = RM.lookup;
  206. // TODO: remove non-curried overloading in v3
  207. /**
  208. * Test whether or not one `Map` contains all of the keys and values contained in another `Map`
  209. *
  210. * @since 2.0.0
  211. */
  212. export var isSubmap = RM.isSubmap;
  213. /**
  214. * @category instances
  215. * @since 2.0.0
  216. */
  217. export var getEq = RM.getEq;
  218. /**
  219. * Gets `Monoid` instance for Maps given `Semigroup` instance for their values
  220. *
  221. * @category instances
  222. * @since 2.0.0
  223. */
  224. export function getMonoid(SK, SA) {
  225. var lookupWithKeyS = lookupWithKey(SK);
  226. return {
  227. concat: function (mx, my) {
  228. if (isEmpty(mx)) {
  229. return my;
  230. }
  231. if (isEmpty(my)) {
  232. return mx;
  233. }
  234. var r = new Map(mx);
  235. var entries = my.entries();
  236. var e;
  237. while (!(e = entries.next()).done) {
  238. var _a = e.value, k = _a[0], a = _a[1];
  239. var mxOptA = lookupWithKeyS(k, mx);
  240. if (_.isSome(mxOptA)) {
  241. r.set(mxOptA.value[0], SA.concat(mxOptA.value[1], a));
  242. }
  243. else {
  244. r.set(k, a);
  245. }
  246. }
  247. return r;
  248. },
  249. empty: new Map()
  250. };
  251. }
  252. /**
  253. * Create a map with one key/value pair
  254. *
  255. * @since 2.0.0
  256. */
  257. export var singleton = function (k, a) { return new Map([[k, a]]); };
  258. export function fromFoldable(E, M, F) {
  259. return function (fka) {
  260. var lookupWithKeyE = lookupWithKey(E);
  261. return F.reduce(fka, new Map(), function (b, _a) {
  262. var k = _a[0], a = _a[1];
  263. var bOpt = lookupWithKeyE(k, b);
  264. if (_.isSome(bOpt)) {
  265. b.set(bOpt.value[0], M.concat(bOpt.value[1], a));
  266. }
  267. else {
  268. b.set(k, a);
  269. }
  270. return b;
  271. });
  272. };
  273. }
  274. var _mapWithIndex = function (fa, f) {
  275. var m = new Map();
  276. var entries = fa.entries();
  277. var e;
  278. while (!(e = entries.next()).done) {
  279. var _a = e.value, key = _a[0], a = _a[1];
  280. m.set(key, f(key, a));
  281. }
  282. return m;
  283. };
  284. /**
  285. * @since 2.10.0
  286. */
  287. export var partitionMapWithIndex = function (f) {
  288. return function (fa) {
  289. var left = new Map();
  290. var right = new Map();
  291. var entries = fa.entries();
  292. var e;
  293. while (!(e = entries.next()).done) {
  294. var _a = e.value, k = _a[0], a = _a[1];
  295. var ei = f(k, a);
  296. if (_.isLeft(ei)) {
  297. left.set(k, ei.left);
  298. }
  299. else {
  300. right.set(k, ei.right);
  301. }
  302. }
  303. return separated(left, right);
  304. };
  305. };
  306. export function partitionWithIndex(predicateWithIndex) {
  307. return function (fa) {
  308. var left = new Map();
  309. var right = new Map();
  310. var entries = fa.entries();
  311. var e;
  312. while (!(e = entries.next()).done) {
  313. var _a = e.value, k = _a[0], a = _a[1];
  314. if (predicateWithIndex(k, a)) {
  315. right.set(k, a);
  316. }
  317. else {
  318. left.set(k, a);
  319. }
  320. }
  321. return separated(left, right);
  322. };
  323. }
  324. /**
  325. * @since 2.10.0
  326. */
  327. export var filterMapWithIndex = function (f) {
  328. return function (fa) {
  329. var m = new Map();
  330. var entries = fa.entries();
  331. var e;
  332. while (!(e = entries.next()).done) {
  333. var _a = e.value, k = _a[0], a = _a[1];
  334. var o = f(k, a);
  335. if (_.isSome(o)) {
  336. m.set(k, o.value);
  337. }
  338. }
  339. return m;
  340. };
  341. };
  342. export function filterWithIndex(p) {
  343. return function (m) {
  344. var out = new Map();
  345. var entries = m.entries();
  346. var e;
  347. while (!(e = entries.next()).done) {
  348. var _a = e.value, k = _a[0], a = _a[1];
  349. if (p(k, a)) {
  350. out.set(k, a);
  351. }
  352. }
  353. return out;
  354. };
  355. }
  356. var _map = function (fa, f) { return _mapWithIndex(fa, function (_, a) { return f(a); }); };
  357. var _filter = function (fa, p) {
  358. return _filterWithIndex(fa, function (_, a) { return p(a); });
  359. };
  360. var _filterMap = function (fa, f) { return _filterMapWithIndex(fa, function (_, a) { return f(a); }); };
  361. var _partition = function (fa, predicate) {
  362. return _partitionWithIndex(fa, function (_, a) { return predicate(a); });
  363. };
  364. var _partitionMap = function (fa, f) { return _partitionMapWithIndex(fa, function (_, a) { return f(a); }); };
  365. var _filterWithIndex = function (fa, p) { return pipe(fa, filterWithIndex(p)); };
  366. var _filterMapWithIndex = function (fa, f) { return pipe(fa, filterMapWithIndex(f)); };
  367. var _partitionWithIndex = function (fa, p) { return pipe(fa, partitionWithIndex(p)); };
  368. var _partitionMapWithIndex = function (fa, f) {
  369. return pipe(fa, partitionMapWithIndex(f));
  370. };
  371. /**
  372. * @category filtering
  373. * @since 2.0.0
  374. */
  375. export var compact = function (fa) {
  376. var m = new Map();
  377. var entries = fa.entries();
  378. var e;
  379. while (!(e = entries.next()).done) {
  380. var _a = e.value, k = _a[0], oa = _a[1];
  381. if (_.isSome(oa)) {
  382. m.set(k, oa.value);
  383. }
  384. }
  385. return m;
  386. };
  387. /**
  388. * @category filtering
  389. * @since 2.0.0
  390. */
  391. export var filter = function (predicate) {
  392. return function (fa) {
  393. return _filter(fa, predicate);
  394. };
  395. };
  396. /**
  397. * @category filtering
  398. * @since 2.0.0
  399. */
  400. export var filterMap = function (f) { return function (fa) {
  401. return _filterMap(fa, f);
  402. }; };
  403. /**
  404. * `map` can be used to turn functions `(a: A) => B` into functions `(fa: F<A>) => F<B>` whose argument and return types
  405. * use the type constructor `F` to represent some computational context.
  406. *
  407. * @category mapping
  408. * @since 2.0.0
  409. */
  410. export var map = function (f) { return function (fa) { return _map(fa, f); }; };
  411. /**
  412. * @category mapping
  413. * @since 2.7.1
  414. */
  415. export var mapWithIndex = function (f) { return function (fa) {
  416. return _mapWithIndex(fa, f);
  417. }; };
  418. /**
  419. * @category filtering
  420. * @since 2.0.0
  421. */
  422. export var partition = function (predicate) {
  423. return function (fa) {
  424. return _partition(fa, predicate);
  425. };
  426. };
  427. /**
  428. * @category filtering
  429. * @since 2.0.0
  430. */
  431. export var partitionMap = function (f) { return function (fa) { return _partitionMap(fa, f); }; };
  432. /**
  433. * @category filtering
  434. * @since 2.0.0
  435. */
  436. export var separate = function (fa) {
  437. var left = new Map();
  438. var right = new Map();
  439. var entries = fa.entries();
  440. var e;
  441. while (!(e = entries.next()).done) {
  442. var _a = e.value, k = _a[0], ei = _a[1];
  443. if (_.isLeft(ei)) {
  444. left.set(k, ei.left);
  445. }
  446. else {
  447. right.set(k, ei.right);
  448. }
  449. }
  450. return separated(left, right);
  451. };
  452. /**
  453. * @category type lambdas
  454. * @since 2.0.0
  455. */
  456. export var URI = 'Map';
  457. /**
  458. * @category instances
  459. * @since 2.11.0
  460. */
  461. export var getUnionSemigroup = function (E, S) {
  462. var unionES = union(E, S);
  463. return {
  464. concat: function (first, second) { return unionES(second)(first); }
  465. };
  466. };
  467. /**
  468. * @category instances
  469. * @since 2.11.0
  470. */
  471. export var getUnionMonoid = function (E, S) { return ({
  472. concat: getUnionSemigroup(E, S).concat,
  473. empty: new Map()
  474. }); };
  475. /**
  476. * @category instances
  477. * @since 2.11.0
  478. */
  479. export var getIntersectionSemigroup = function (E, S) {
  480. var intersectionES = intersection(E, S);
  481. return {
  482. concat: function (first, second) { return intersectionES(second)(first); }
  483. };
  484. };
  485. /**
  486. * @category instances
  487. * @since 2.11.0
  488. */
  489. export var getDifferenceMagma = function (E) {
  490. return function () {
  491. var differenceE = difference(E);
  492. return {
  493. concat: function (first, second) { return differenceE(second)(first); }
  494. };
  495. };
  496. };
  497. /**
  498. * @category filtering
  499. * @since 2.0.0
  500. */
  501. export function getFilterableWithIndex() {
  502. return {
  503. URI: URI,
  504. _E: undefined,
  505. map: _map,
  506. mapWithIndex: _mapWithIndex,
  507. compact: compact,
  508. separate: separate,
  509. filter: _filter,
  510. filterMap: _filterMap,
  511. partition: _partition,
  512. partitionMap: _partitionMap,
  513. partitionMapWithIndex: _partitionMapWithIndex,
  514. partitionWithIndex: _partitionWithIndex,
  515. filterMapWithIndex: _filterMapWithIndex,
  516. filterWithIndex: _filterWithIndex
  517. };
  518. }
  519. /**
  520. * @category filtering
  521. * @since 2.0.0
  522. */
  523. export function getWitherable(O) {
  524. var TWI = getTraversableWithIndex(O);
  525. return {
  526. URI: URI,
  527. _E: undefined,
  528. map: _map,
  529. compact: compact,
  530. separate: separate,
  531. filter: _filter,
  532. filterMap: _filterMap,
  533. partition: _partition,
  534. partitionMap: _partitionMap,
  535. reduce: TWI.reduce,
  536. foldMap: TWI.foldMap,
  537. reduceRight: TWI.reduceRight,
  538. traverse: TWI.traverse,
  539. sequence: TWI.sequence,
  540. mapWithIndex: _mapWithIndex,
  541. reduceWithIndex: TWI.reduceWithIndex,
  542. foldMapWithIndex: TWI.foldMapWithIndex,
  543. reduceRightWithIndex: TWI.reduceRightWithIndex,
  544. traverseWithIndex: TWI.traverseWithIndex,
  545. wilt: wiltDefault(TWI, Compactable),
  546. wither: witherDefault(TWI, Compactable)
  547. };
  548. }
  549. /**
  550. * @category folding
  551. * @since 2.11.0
  552. */
  553. export var reduce = RM.reduce;
  554. /**
  555. * @category folding
  556. * @since 2.11.0
  557. */
  558. export var foldMap = RM.foldMap;
  559. /**
  560. * @category folding
  561. * @since 2.11.0
  562. */
  563. export var reduceRight = RM.reduceRight;
  564. /**
  565. * @category folding
  566. * @since 2.11.0
  567. */
  568. export var getFoldable = function (O) {
  569. return __assign(__assign({}, RM.getFoldable(O)), { URI: URI });
  570. };
  571. /**
  572. * @category folding
  573. * @since 2.11.0
  574. */
  575. export var reduceWithIndex = RM.reduceWithIndex;
  576. /**
  577. * @category folding
  578. * @since 2.11.0
  579. */
  580. export var foldMapWithIndex = RM.foldMapWithIndex;
  581. /**
  582. * @category folding
  583. * @since 2.11.0
  584. */
  585. export var reduceRightWithIndex = RM.reduceRightWithIndex;
  586. /**
  587. * @category folding
  588. * @since 2.10.0
  589. */
  590. export var getFoldableWithIndex = function (O) {
  591. return __assign(__assign({}, RM.getFoldableWithIndex(O)), { URI: URI });
  592. };
  593. /**
  594. * @category traversing
  595. * @since 2.10.0
  596. */
  597. export var getTraversableWithIndex = function (O) {
  598. var FWI = getFoldableWithIndex(O);
  599. var keysO = keys(O);
  600. var traverseWithIndex = function (F) {
  601. return function (ta, f) {
  602. var fm = F.of(new Map());
  603. var ks = keysO(ta);
  604. var len = ks.length;
  605. var _loop_1 = function (i) {
  606. var key = ks[i];
  607. var a = ta.get(key);
  608. fm = F.ap(F.map(fm, function (m) { return function (b) { return m.set(key, b); }; }), f(key, a));
  609. };
  610. for (var i = 0; i < len; i++) {
  611. _loop_1(i);
  612. }
  613. return fm;
  614. };
  615. };
  616. var traverse = function (F) {
  617. var traverseWithIndexF = traverseWithIndex(F);
  618. return function (ta, f) { return traverseWithIndexF(ta, function (_, a) { return f(a); }); };
  619. };
  620. var sequence = function (F) {
  621. var traverseWithIndexF = traverseWithIndex(F);
  622. return function (ta) { return traverseWithIndexF(ta, function (_, a) { return a; }); };
  623. };
  624. return {
  625. URI: URI,
  626. _E: undefined,
  627. map: _map,
  628. mapWithIndex: _mapWithIndex,
  629. reduce: FWI.reduce,
  630. foldMap: FWI.foldMap,
  631. reduceRight: FWI.reduceRight,
  632. reduceWithIndex: FWI.reduceWithIndex,
  633. foldMapWithIndex: FWI.foldMapWithIndex,
  634. reduceRightWithIndex: FWI.reduceRightWithIndex,
  635. traverse: traverse,
  636. sequence: sequence,
  637. traverseWithIndex: traverseWithIndex
  638. };
  639. };
  640. /**
  641. * @category instances
  642. * @since 2.7.0
  643. */
  644. export var Functor = {
  645. URI: URI,
  646. map: _map
  647. };
  648. /**
  649. * @category mapping
  650. * @since 2.10.0
  651. */
  652. export var flap = /*#__PURE__*/ flap_(Functor);
  653. /**
  654. * @category instances
  655. * @since 2.7.0
  656. */
  657. export var Compactable = {
  658. URI: URI,
  659. compact: compact,
  660. separate: separate
  661. };
  662. /**
  663. * @category instances
  664. * @since 2.7.0
  665. */
  666. export var Filterable = {
  667. URI: URI,
  668. map: _map,
  669. compact: compact,
  670. separate: separate,
  671. filter: _filter,
  672. filterMap: _filterMap,
  673. partition: _partition,
  674. partitionMap: _partitionMap
  675. };
  676. // -------------------------------------------------------------------------------------
  677. // utils
  678. // -------------------------------------------------------------------------------------
  679. var copy = function (m) { return new Map(m); };
  680. /**
  681. * @since 2.11.0
  682. */
  683. export var union = function (E, M) {
  684. var unionEM = RM.union(E, M);
  685. return function (second) { return function (first) {
  686. if (isEmpty(first)) {
  687. return copy(second);
  688. }
  689. if (isEmpty(second)) {
  690. return copy(first);
  691. }
  692. return unionEM(second)(first);
  693. }; };
  694. };
  695. /**
  696. * @since 2.11.0
  697. */
  698. export var intersection = function (E, M) {
  699. var intersectionEM = RM.intersection(E, M);
  700. return function (second) { return function (first) {
  701. if (isEmpty(first) || isEmpty(second)) {
  702. return new Map();
  703. }
  704. return intersectionEM(second)(first);
  705. }; };
  706. };
  707. /**
  708. * @since 2.11.0
  709. */
  710. export var difference = function (E) {
  711. var differenceE = RM.difference(E);
  712. return function (second) {
  713. return function (first) {
  714. if (isEmpty(first)) {
  715. return copy(second);
  716. }
  717. if (isEmpty(second)) {
  718. return copy(first);
  719. }
  720. return differenceE(second)(first);
  721. };
  722. };
  723. };
  724. // -------------------------------------------------------------------------------------
  725. // deprecated
  726. // -------------------------------------------------------------------------------------
  727. /**
  728. * Use a `new Map()` instead.
  729. *
  730. * @category zone of death
  731. * @since 2.0.0
  732. * @deprecated
  733. */
  734. export var empty = new Map();
  735. /**
  736. * Use [`upsertAt`](#upsertat) instead.
  737. *
  738. * @category zone of death
  739. * @since 2.0.0
  740. * @deprecated
  741. */
  742. export var insertAt = upsertAt;
  743. /**
  744. * Use [`Filterable`](#filterable) instead.
  745. *
  746. * @category zone of death
  747. * @since 2.0.0
  748. * @deprecated
  749. */
  750. export var map_ = Filterable;