test-demo.mjs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. 'use strict';
  2. import test from 'tape-six';
  3. import {Transform} from 'stream';
  4. import chain from '../src/index.js';
  5. import fromIterable from '../src/utils/fromIterable.js';
  6. const getTotalFromDatabaseByKey = async x =>
  7. new Promise(resolve => {
  8. setTimeout(() => {
  9. resolve(Math.min(x % 10, 3));
  10. }, 20);
  11. });
  12. test.asPromise('demo: default', (t, resolve) => {
  13. const c = chain([
  14. // transforms a value
  15. x => x * x,
  16. // returns several values
  17. x => chain.many([x - 1, x, x + 1]),
  18. // waits for an asynchronous operation
  19. async x => await getTotalFromDatabaseByKey(x),
  20. // returns multiple values with a generator
  21. function* (x) {
  22. for (let i = x; i > 0; --i) {
  23. yield i;
  24. }
  25. return 0;
  26. },
  27. // filters out even values
  28. x => (x % 2 ? x : null),
  29. // uses an arbitrary transform stream
  30. new Transform({
  31. objectMode: true,
  32. transform(x, _, callback) {
  33. callback(null, x + 1);
  34. }
  35. })
  36. ]),
  37. output = [];
  38. c.on('data', data => output.push(data));
  39. c.on('end', () => {
  40. t.deepEqual(output, [2, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2]);
  41. resolve();
  42. });
  43. fromIterable([1, 2, 3]).pipe(c);
  44. });
  45. test.asPromise('demo: no grouping', (t, resolve) => {
  46. const c = chain(
  47. [
  48. // transforms a value
  49. x => x * x,
  50. // returns several values
  51. x => chain.many([x - 1, x, x + 1]),
  52. // waits for an asynchronous operation
  53. async x => await getTotalFromDatabaseByKey(x),
  54. // returns multiple values with a generator
  55. function* (x) {
  56. for (let i = x; i > 0; --i) {
  57. yield i;
  58. }
  59. return 0;
  60. },
  61. // filters out even values
  62. x => (x % 2 ? x : null),
  63. // uses an arbitrary transform stream
  64. new Transform({
  65. objectMode: true,
  66. transform(x, _, callback) {
  67. callback(null, x + 1);
  68. }
  69. })
  70. ],
  71. {noGrouping: true}
  72. ),
  73. output = [];
  74. c.on('data', data => output.push(data));
  75. c.on('end', () => {
  76. t.deepEqual(output, [2, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2]);
  77. resolve();
  78. });
  79. fromIterable([1, 2, 3]).pipe(c);
  80. });