@explorable-viz/fluid 0.7.60 → 0.7.62

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,29 @@
1
+ {
2
+ "parserOptions": {
3
+ "ecmaVersion": 6,
4
+ "sourceType": "module"
5
+ },
6
+ "extends": "eslint:recommended",
7
+ "env": {
8
+ "node": true
9
+ },
10
+ "rules": {
11
+ "strict": [2, "global"],
12
+ "block-scoped-var": 2,
13
+ "consistent-return": 2,
14
+ "eqeqeq": [2, "smart"],
15
+ "guard-for-in": 2,
16
+ "no-caller": 2,
17
+ "no-extend-native": 2,
18
+ "no-loop-func": 2,
19
+ "no-new": 2,
20
+ "no-param-reassign": 2,
21
+ "no-return-assign": 2,
22
+ "no-unused-expressions": 2,
23
+ "no-use-before-define": 2,
24
+ "radix": [2, "always"],
25
+ "indent": [2, 2],
26
+ "quotes": [2, "double"],
27
+ "semi": [2, "always"]
28
+ }
29
+ }
@@ -0,0 +1,8 @@
1
+ /.*
2
+ !/.gitignore
3
+ !/.eslintrc.json
4
+ !/.github/
5
+ /bower_components/
6
+ /node_modules/
7
+ /output/
8
+ package-lock.json
@@ -0,0 +1,29 @@
1
+ {
2
+ "parserOptions": {
3
+ "ecmaVersion": 6,
4
+ "sourceType": "module"
5
+ },
6
+ "extends": "eslint:recommended",
7
+ "env": {
8
+ "node": true
9
+ },
10
+ "rules": {
11
+ "strict": [2, "global"],
12
+ "block-scoped-var": 2,
13
+ "consistent-return": 2,
14
+ "eqeqeq": [2, "smart"],
15
+ "guard-for-in": 2,
16
+ "no-caller": 2,
17
+ "no-extend-native": 2,
18
+ "no-loop-func": 2,
19
+ "no-new": 2,
20
+ "no-param-reassign": 2,
21
+ "no-return-assign": 2,
22
+ "no-unused-expressions": 2,
23
+ "no-use-before-define": 2,
24
+ "radix": [2, "always"],
25
+ "indent": [2, 2],
26
+ "quotes": [2, "double"],
27
+ "semi": [2, "always"]
28
+ }
29
+ }
@@ -0,0 +1,8 @@
1
+ /.*
2
+ !/.gitignore
3
+ !/.eslintrc.json
4
+ !/.github/
5
+ /bower_components/
6
+ /node_modules/
7
+ /output/
8
+ package-lock.json
@@ -0,0 +1,29 @@
1
+ {
2
+ "parserOptions": {
3
+ "ecmaVersion": 6,
4
+ "sourceType": "module"
5
+ },
6
+ "extends": "eslint:recommended",
7
+ "env": {
8
+ "node": true
9
+ },
10
+ "rules": {
11
+ "strict": [2, "global"],
12
+ "block-scoped-var": 2,
13
+ "consistent-return": 2,
14
+ "eqeqeq": [2, "smart"],
15
+ "guard-for-in": 2,
16
+ "no-caller": 2,
17
+ "no-extend-native": 2,
18
+ "no-loop-func": 2,
19
+ "no-new": 2,
20
+ "no-param-reassign": 2,
21
+ "no-return-assign": 2,
22
+ "no-unused-expressions": 2,
23
+ "no-use-before-define": 2,
24
+ "radix": [2, "always"],
25
+ "indent": [2, 2],
26
+ "quotes": [2, "double"],
27
+ "semi": [2, "always"]
28
+ }
29
+ }
@@ -0,0 +1,8 @@
1
+ /.*
2
+ !/.gitignore
3
+ !/.eslintrc.json
4
+ !/.github/
5
+ /bower_components/
6
+ /node_modules/
7
+ /output/
8
+ package-lock.json
@@ -0,0 +1,8 @@
1
+ /.*
2
+ !/.github
3
+ !/.gitignore
4
+ !/.npmrc
5
+ !/.travis.yml
6
+ /bower_components/
7
+ /node_modules/
8
+ /output/
@@ -0,0 +1 @@
1
+ package-lock=false
package/README.md CHANGED
@@ -22,23 +22,42 @@ Additionally, for Windows users only:
22
22
  - Run `./script/setup/dev-setup.sh` from the top-level directory
23
23
  - Run `yarn build`
24
24
 
25
- #### Running tests on command line
25
+ ## Use
26
26
 
27
- After building, tests can be run from the command line via `yarn test-all`
27
+ The following assumes you have already succesfully run `yarn build` (see above).
28
28
 
29
- #### Running tests in browser
30
- - As per command-line tests above, but run `yarn test-browser`, which opens
31
- a browser window.
32
- - To observe the status of tests, click `Debug` in the browser window, and then open the JavaScript Console for your browser (e.g., via the Developer Tools).
29
+ ### Running programs from the command line
33
30
 
34
- #### Running the fluid.org website locally
31
+ Fluid examples in the `dist/fluid/fluid` can be evaluated from the command line as follows
32
+ (from the top-level directory):
35
33
 
36
- (Assumes you have already run `yarn build`)
34
+ ```
35
+ npx fluid evaluate -f <path>
36
+ ```
37
+ Note that the path is relative and should not include the `.fld` extension, e.g. for the `range.fld` example:
38
+ ```
39
+ % npx fluid evaluate -f example/range
40
+ ((0, 0) : ((0, 1) : ((1, 0) : ((1, 1) : []))))
41
+ Success
42
+ ```
43
+
44
+ ### Running the fluid.org website locally
37
45
 
38
46
  - `yarn serve fluid-org` (you may be prompted to proceed: type `y`).
39
47
  - Open a browser at the served URL (usually `127.0.0.1:8080`)
40
48
 
41
- #### Run Puppeteer tests for page Y of website X
49
+ ## Testing
50
+
51
+ ### Running the tests from the command line
52
+
53
+ After building, tests can be run from the command line via `yarn test-all`
54
+
55
+ ### Running tests in browser
56
+ - As per command-line tests above, but run `yarn test-browser`, which opens
57
+ a browser window.
58
+ - To observe the status of tests, click `Debug` in the browser window, and then open the JavaScript Console for your browser (e.g., via the Developer Tools).
59
+
60
+ ### Run Puppeteer tests for page Y of website X
42
61
 
43
62
  Rebuild with `puppeteerTests.headless` set to `false` to run in browser. Then:
44
63
  - `yarn bundle-website X`
Binary file
@@ -19,6 +19,5 @@ let plot year countries =
19
19
  in ScatterPlot {
20
20
  caption: "Clean energy efficiency vs. proportion of renewable energy capacity",
21
21
  points: plot 2018 [ "BRA", "CHN", "DEU", "FRA", "EGY", "IND", "JPN", "MEX", "NGA", "USA" ],
22
- xlabel: "Renewables/TotalEnergyCap",
23
- ylabel: "Clean Capacity Factor"
22
+ labels: { x: "Renewables/TotalEnergyCap", y: "Clean Capacity Factor" }
24
23
  }
@@ -25,6 +25,5 @@ in ScatterPlot {
25
25
  x: country.nonRenewables / country.totalCap,
26
26
  y: country.renCapFactor
27
27
  }| country <- energy 2018 ["USA"]],
28
- xlabel: "Renewables/TotalEnergyCap",
29
- ylabel: "Clean Capacity Factor"
28
+ labels: { x: "Renewables/TotalEnergyCap", y: "Clean Capacity Factor" }
30
29
  }
@@ -2,8 +2,8 @@ let countries = ["BRA", "EGY", "IND", "JPN"];
2
2
  let totalFor year country =
3
3
  let [ row ] = [ row | row <- nonRenewables, row.year == year, row.country == country ]
4
4
  in row.nuclearOut + row.gasOut + row.coalOut + row.petrolOut;
5
- stack year = [ { y: country, z: totalFor year country } | country <- countries ];
6
- yearData year = [ row | row <- nonRenewables, row.year == year, row.country `elem` countries ]
5
+ let stack year = [ { y: country, z: totalFor year country } | country <- countries ];
6
+ let yearData year = [ row | row <- nonRenewables, row.year == year, row.country `elem` countries ]
7
7
  in MultiView {
8
8
  barChart: BarChart {
9
9
  caption: "Non-renewables output",
@@ -16,7 +16,6 @@ in MultiView {
16
16
  x: sum [ row.nuclearOut | row <- yearData year ],
17
17
  y: sum [ row.nuclearCap | row <- yearData year ]
18
18
  } | year <- [2014..2018] ],
19
- xlabel: "Nuclear capacity",
20
- ylabel: "Nuclear output"
19
+ labels: { x: "Nuclear capacity", y: "Nuclear output" }
21
20
  }
22
21
  }
@@ -33,7 +33,6 @@ MultiView {
33
33
  in ScatterPlot {
34
34
  caption: "Clean energy efficiency vs proportion of renewable energy capacity",
35
35
  points: plot 2018 [ "BRA", "CHN", "DEU", "FRA", "EGY", "IND", "JPN", "MEX", "NGA", "USA" ],
36
- xlabel: "Renewables/TotalEnergyCap",
37
- ylabel: "Clean Capacity Factor"
36
+ labels: { x: "Renewables/TotalEnergyCap", y: "Clean Capacity Factor" }
38
37
  }
39
38
  }
@@ -2,15 +2,16 @@ let zero n = const n;
2
2
  wrap n n_max = ((n - 1) `mod` n_max) + 1;
3
3
  extend n = min (max n 1);
4
4
 
5
- let convolve image kernel method =
5
+ let convolve image kernel boundary =
6
6
  let ((m, n), (i, j)) = (dims image, dims kernel);
7
7
  (half_i, half_j) = (i `quot` 2, j `quot` 2);
8
8
  area = i * j
9
9
  in [| let weightedSum = sum [
10
10
  image!(x, y) * kernel!(i' + 1, j' + 1)
11
11
  | (i', j') <- range (0, 0) (i - 1, j - 1),
12
- let x = method (m' + i' - half_i) m,
13
- let y = method (n' + j' - half_j) n,
12
+ let x = boundary (m' + i' - half_i) m,
13
+ let y = boundary (n' + j' - half_j) n,
14
14
  x >= 1, x <= m, y >= 1, y <= n
15
15
  ] in weightedSum `quot` area
16
16
  | (m', n') in (m, n) |];
17
+
@@ -2,17 +2,17 @@ let likelihoodMap table prob = (fromSome (find (fun x -> x.prob <= prob) table))
2
2
 
3
3
  let mkPercent num = (numToStr (num * 100)) ++ "%";
4
4
 
5
- let leqP n m =
5
+ let leqP n m =
6
6
  if n <= m
7
7
  then "less"
8
8
  else "more";
9
9
 
10
- let gradedLeqP n m =
11
- let ratio = n / m
12
- in if ratio <= 1.0
10
+ let gradedLeqP n m =
11
+ let ratio = n / m
12
+ in if ratio <= 1.0
13
13
  then if ratio <=0.5
14
14
  then "much less"
15
15
  else "less"
16
16
  else if ratio >= 2.0
17
17
  then "much more"
18
- else "more";
18
+ else "more";
@@ -10170,8 +10170,7 @@ var dataTypes = /* @__PURE__ */ foldrArray(Cons)(Nil)([
10170
10170
  /* @__PURE__ */ $Tuple("Viewport", 9)
10171
10171
  ]),
10172
10172
  /* @__PURE__ */ dataType("Transform")([/* @__PURE__ */ $Tuple("Scale", 2), /* @__PURE__ */ $Tuple("Translate", 2)]),
10173
- /* @__PURE__ */ dataType("Marker")([/* @__PURE__ */ $Tuple("Arrowhead", 0)]),
10174
- /* @__PURE__ */ dataType("Explanation")([/* @__PURE__ */ $Tuple("Explained", 2)])
10173
+ /* @__PURE__ */ dataType("Marker")([/* @__PURE__ */ $Tuple("Arrowhead", 0)])
10175
10174
  ]);
10176
10175
  var ctrToDataType = /* @__PURE__ */ (() => fromFoldable2(foldableList)(bindList.bind(listMap((d) => listMap((v) => $Tuple(
10177
10176
  v,
@@ -24828,17 +24827,18 @@ var parseProgram = (loadFile2) => (folder) => (file) => (dictMonadAff) => (dictM
24828
24827
  })());
24829
24828
  var module_2 = (dictMonadAff) => {
24830
24829
  const Monad0 = dictMonadAff.MonadEffect0().Monad0();
24831
- const $0 = Monad0.Bind1();
24830
+ const Bind1 = Monad0.Bind1();
24831
+ const Applicative0 = Monad0.Applicative0();
24832
24832
  return (dictMonadError) => {
24833
24833
  const parse1 = parse(dictMonadError);
24834
24834
  const desugarModuleFwd = moduleFwd(dictMonadError)(boundedLattice2);
24835
- return (loadFile2) => (file) => (v) => {
24836
- const $1 = v.mods;
24837
- return $0.bind(loadFile2("fluid")(file)(dictMonadAff)(dictMonadError))((src) => $0.bind($0.bind(parse1(src)(module_))(desugarModuleFwd))((mod) => Monad0.Applicative0().pure({
24835
+ return (loadFile2) => (folder) => (file) => (v) => {
24836
+ const $0 = v.mods;
24837
+ return Bind1.bind(Applicative0.pure())(() => Bind1.bind(loadFile2(folder)(file)(dictMonadAff)(dictMonadError))((src) => Bind1.bind(Bind1.bind(parse1(src)(module_))(desugarModuleFwd))((mod) => Applicative0.pure({
24838
24838
  primitives: v.primitives,
24839
- mods: $List("Cons", mod, $1),
24839
+ mods: $List("Cons", mod, $0),
24840
24840
  datasets: v.datasets
24841
- })));
24841
+ }))));
24842
24842
  };
24843
24843
  };
24844
24844
  };
@@ -24872,7 +24872,7 @@ var prepConfig = (dictMonadAff) => {
24872
24872
  return (dictMonadError) => {
24873
24873
  const desug1 = exprFwd(boundedLattice2)(dictMonadError)(joinSemilatticeUnit);
24874
24874
  const initialConfig1 = initialConfig(dictMonadError)(fVExpr);
24875
- return (loadFile2) => (file) => (progCxt) => $0.bind(parseProgram(loadFile2)("fluid/example")(file)(dictMonadAff)(dictMonadError))((s) => $0.bind(desug1(s))((e) => $0.bind(initialConfig1(e)(progCxt))((gconfig) => Monad0.Applicative0().pure({
24875
+ return (v) => (file) => (progCxt) => $0.bind(parseProgram(v.loadFile)(v.fluidSrcPath)(file)(dictMonadAff)(dictMonadError))((s) => $0.bind(desug1(s))((e) => $0.bind(initialConfig1(e)(progCxt))((gconfig) => Monad0.Applicative0().pure({
24876
24876
  s,
24877
24877
  e,
24878
24878
  gconfig
@@ -24884,10 +24884,10 @@ var datasetAs = (dictMonadAff) => {
24884
24884
  const $0 = Monad0.Bind1();
24885
24885
  return (dictMonadError) => {
24886
24886
  const desug1 = exprFwd(boundedLattice2)(dictMonadError)(joinSemilatticeUnit);
24887
- return (loadFile2) => (v) => (v1) => {
24887
+ return (loadFile2) => (folder) => (v) => (v1) => {
24888
24888
  const $1 = v1.datasets;
24889
24889
  const $2 = v._1;
24890
- return $0.bind($0.bind(parseProgram(loadFile2)("fluid")(v._2)(dictMonadAff)(dictMonadError))(desug1))((e\u03B1) => Monad0.Applicative0().pure({
24890
+ return $0.bind($0.bind(parseProgram(loadFile2)(folder)(v._2)(dictMonadAff)(dictMonadError))(desug1))((e\u03B1) => Monad0.Applicative0().pure({
24891
24891
  primitives: v1.primitives,
24892
24892
  mods: v1.mods,
24893
24893
  datasets: $List("Cons", $Tuple($2, e\u03B1), $1)
@@ -24904,12 +24904,12 @@ var loadProgCxt = (dictMonadAff) => {
24904
24904
  return (dictMonadError) => {
24905
24905
  const module_22 = module_1(dictMonadError);
24906
24906
  const datasetAs2 = datasetAs1(dictMonadError);
24907
- return (loadFile2) => (mods) => (datasets) => $0.bind($0.bind(Monad0.Applicative0().pure({
24907
+ return (v) => (mods) => (datasets) => $0.bind($0.bind(Monad0.Applicative0().pure({
24908
24908
  primitives,
24909
24909
  mods: Nil,
24910
24910
  datasets: Nil
24911
- }))(concatM1(arrayMap(module_22(loadFile2))(["lib/prelude", ...mods]))))(concatM1(arrayMap((() => {
24912
- const $1 = datasetAs2(loadFile2);
24911
+ }))(concatM1(arrayMap(module_22(v.loadFile)(v.fluidSrcPath))(["lib/prelude", ...mods]))))(concatM1(arrayMap((() => {
24912
+ const $1 = datasetAs2(v.loadFile)(v.fluidSrcPath);
24913
24913
  return (x) => $1($Tuple(x._1, x._2));
24914
24914
  })())(datasets)));
24915
24915
  };
@@ -25068,6 +25068,20 @@ var loadFile = (v) => (v1) => (dictMonadAff) => {
25068
25068
  const Monad0 = dictMonadAff.MonadEffect0().Monad0();
25069
25069
  return (dictMonadError) => Monad0.Bind1().bind(dictMonadAff.liftAff(toAff2(readTextFile)(UTF8)(v + "/" + v1 + ".fld")))((buffer) => Monad0.Applicative0().pure(buffer));
25070
25070
  };
25071
+ var loadProgCxt2 = (dictMonadAff) => {
25072
+ const loadProgCxt1 = loadProgCxt(dictMonadAff);
25073
+ return (dictMonadError) => {
25074
+ const loadProgCxt22 = loadProgCxt1(dictMonadError);
25075
+ return (fluidSrcPath) => loadProgCxt22({ loadFile, fluidSrcPath });
25076
+ };
25077
+ };
25078
+ var prepConfig2 = (dictMonadAff) => {
25079
+ const prepConfig1 = prepConfig(dictMonadAff);
25080
+ return (dictMonadError) => {
25081
+ const prepConfig22 = prepConfig1(dictMonadError);
25082
+ return (fluidSrcPath) => prepConfig22({ loadFile, fluidSrcPath });
25083
+ };
25084
+ };
25071
25085
 
25072
25086
  // output-es/Node.ChildProcess/foreign.js
25073
25087
  import { spawn, exec, execFile, execSync, execFileSync, fork as cp_fork } from "child_process";
@@ -28359,8 +28373,8 @@ var execParserPure = (pprefs) => (pinfo) => (args) => {
28359
28373
  // output-es/Fluid/index.js
28360
28374
  var $Command = (tag, _1, _2) => ({ tag, _1, _2 });
28361
28375
  var $Program = (_1) => ({ tag: "Program", _1 });
28362
- var loadProgCxt2 = /* @__PURE__ */ loadProgCxt(monadAffAff)(monadErrorAff)(loadFile);
28363
- var prepConfig2 = /* @__PURE__ */ prepConfig(monadAffAff)(monadErrorAff)(loadFile);
28376
+ var loadProgCxt3 = /* @__PURE__ */ loadProgCxt2(monadAffAff)(monadErrorAff);
28377
+ var prepConfig3 = /* @__PURE__ */ prepConfig2(monadAffAff)(monadErrorAff);
28364
28378
  var graphEval2 = /* @__PURE__ */ graphEval(monadErrorAff);
28365
28379
  var fromFoldable29 = /* @__PURE__ */ (() => fromFoldableImpl(foldableList.foldr))();
28366
28380
  var Evaluate = (value0) => $Command("Evaluate", value0);
@@ -28368,7 +28382,7 @@ var Publish = (value0) => (value1) => $Command("Publish", value0, value1);
28368
28382
  var parseImports = /* @__PURE__ */ $Parser(
28369
28383
  "BindP",
28370
28384
  /* @__PURE__ */ manyM(/* @__PURE__ */ option(readerAsk)(/* @__PURE__ */ (() => {
28371
- const $0 = help("A comma separated list of import file locations");
28385
+ const $0 = help("Comma-separated list of files to import");
28372
28386
  const $1 = $0._2._1.tag === "Nothing" ? Nothing : $0._2._1;
28373
28387
  const $2 = $0._2._2.tag === "Nothing" ? Nothing : $0._2._2;
28374
28388
  return $Mod(
@@ -28384,7 +28398,7 @@ var parseImports = /* @__PURE__ */ $Parser(
28384
28398
  );
28385
28399
  var evaluate = (v) => {
28386
28400
  const $0 = v._1.fileName;
28387
- return _bind(loadProgCxt2(v._1.imports)(v._1.datasets))((progCxt) => _bind(prepConfig2($0)(progCxt))((v1) => _bind(graphEval2(v1.gconfig)(v1.e))((v2) => _pure($Val(
28401
+ return _bind(loadProgCxt3("fluid")(v._1.imports)(v._1.datasets))((progCxt) => _bind(prepConfig3("fluid")($0)(progCxt))((v1) => _bind(graphEval2(v1.gconfig)(v1.e))((v2) => _pure($Val(
28388
28402
  void 0,
28389
28403
  functorBaseVal.map((v$1) => {
28390
28404
  })(v2["out\u03B1"]._2)
@@ -28401,26 +28415,29 @@ var copyOptions = {
28401
28415
  encoding: Nothing,
28402
28416
  shell: Nothing
28403
28417
  };
28404
- var publish = (website) => ($$package) => exec2($$package ? "./node_modules/@explorable-viz/fluid/script/bundle-website.sh -w " + website + " -r true" : "./script/bundle-website.sh -w " + website)(copyOptions)((v) => {
28405
- if (v.error.tag === "Just") {
28406
- return log(showErrorImpl(v.error._1));
28407
- }
28408
- if (v.error.tag === "Nothing") {
28409
- const $0 = toString2(monadEffect)(ASCII)(v.stdout);
28410
- return () => {
28411
- const $1 = $0();
28412
- return log($1)();
28413
- };
28414
- }
28415
- fail();
28416
- });
28418
+ var publish = (website) => ($$package) => {
28419
+ const cmd$p = "/script/bundle-website.sh -w " + website;
28420
+ return exec2($$package ? "./node_modules/@explorable-viz/fluid" + cmd$p + " -r true" : "." + cmd$p)(copyOptions)((v) => {
28421
+ if (v.error.tag === "Just") {
28422
+ return log(showErrorImpl(v.error._1));
28423
+ }
28424
+ if (v.error.tag === "Nothing") {
28425
+ const $0 = toString2(monadEffect)(ASCII)(v.stdout);
28426
+ return () => {
28427
+ const $1 = $0();
28428
+ return log($1)();
28429
+ };
28430
+ }
28431
+ fail();
28432
+ });
28433
+ };
28417
28434
  var dispatchCommand = (v) => {
28418
28435
  if (v.tag === "Evaluate") {
28419
28436
  return _bind(evaluate(v._1))((v1) => _liftEffect(log(intercalate4("\n")(removeDocWS(prettyVal(highlightableUnit).pretty(v1)).lines))));
28420
28437
  }
28421
28438
  if (v.tag === "Publish") {
28422
- return _bind(_map((v$1) => {
28423
- })(_liftEffect(publish(v._1)(v._2))))(() => _liftEffect(log("Published")));
28439
+ return _map((v$1) => {
28440
+ })(_liftEffect(publish(v._1)(v._2)));
28424
28441
  }
28425
28442
  fail();
28426
28443
  };
@@ -28429,7 +28446,8 @@ var callback = (v) => {
28429
28446
  return log(showErrorImpl(v._1));
28430
28447
  }
28431
28448
  if (v.tag === "Right") {
28432
- return log("Success");
28449
+ return () => {
28450
+ };
28433
28451
  }
28434
28452
  fail();
28435
28453
  };
@@ -28459,24 +28477,10 @@ var parsePair = /* @__PURE__ */ between3("(")(")")((s) => {
28459
28477
  }
28460
28478
  return $Either("Left", "Expected a pair but got " + s);
28461
28479
  });
28462
- var parseDataset$p = (s) => {
28463
- const $0 = parsePair(s);
28464
- return (() => {
28465
- if ($0.tag === "Left") {
28466
- const $1 = $0._1;
28467
- return (v) => $Either("Left", $1);
28468
- }
28469
- if ($0.tag === "Right") {
28470
- const $1 = $0._1;
28471
- return (f) => f($1);
28472
- }
28473
- fail();
28474
- })()((dataset) => $Either("Right", dataset));
28475
- };
28476
28480
  var parseDatasets = /* @__PURE__ */ $Parser(
28477
28481
  "BindP",
28478
- /* @__PURE__ */ manyM(/* @__PURE__ */ option(/* @__PURE__ */ eitherReader(parseDataset$p))(/* @__PURE__ */ (() => {
28479
- const $0 = help("A comma separated list of datasets");
28482
+ /* @__PURE__ */ manyM(/* @__PURE__ */ option(/* @__PURE__ */ eitherReader(parsePair))(/* @__PURE__ */ (() => {
28483
+ const $0 = help("Comma-separated list of datasets");
28480
28484
  const $1 = $0._2._1.tag === "Nothing" ? Nothing : $0._2._1;
28481
28485
  const $2 = $0._2._2.tag === "Nothing" ? Nothing : $0._2._2;
28482
28486
  return $Mod(