@explorable-viz/fluid 0.7.60 → 0.7.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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(