@explorable-viz/fluid 0.11.2 → 0.11.4

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.
@@ -1,18 +1,26 @@
1
+ # type Colour = Str
2
+ # type Colours = List Colour
3
+ # type Cat = Str
4
+
5
+ # Group has location (0, 0) because it doesn't interfere with positioning of its children.
6
+ # GraphicsElement -> Point
1
7
  def coords(Group(gs)): Point(0, 0)
2
8
  def coords(Rect(x, y, _, _, _)): Point(x, y)
3
9
  def coords(String(x, y, _, _, _)): Point(x, y)
4
10
  def coords(Viewport(x, y, _, _, _, _, _, _, _)): Point(x, y)
5
11
 
12
+ # GraphicsElement -> Float
6
13
  def get_x(g):
7
14
  def Point(x, _): coords(g)
8
-
9
15
  x
10
16
 
17
+ # GraphicsElement -> Float
11
18
  def get_y(g):
12
19
  def Point(_, y): coords(g)
20
+ y
13
21
 
14
- x
15
-
22
+ # Want some kind of typeclass mechanism plus record accessors/updaters.
23
+ # Float -> GraphicsElement -> GraphicsElement
16
24
  def set_x(x, Group(gs)):
17
25
  error("Group has immutable coordinates")
18
26
  def set_x(x, Rect(_, y, w, h, fill)):
@@ -22,9 +30,14 @@ def set_x(x, String(_, y, str, anchor, baseline)):
22
30
  def set_x(x, Viewport(_, y, w, h, fill, margin, scale, translate, g)):
23
31
  Viewport(x, y, w, h, fill, margin, scale, translate, g)
24
32
 
33
+ # (Point, Point) -> Point
25
34
  def dimensions2((Point(x1, y1), Point(x2, y2))):
26
35
  Point(max(x1, x2), max(y1, y2))
27
36
 
37
+ # For Group, dimensions are relative to implicit coords of (0, 0), since a Group's children are effectively
38
+ # positioned relative to parent of Group. For Polymarker, will probably have to ignore the markers themselves,
39
+ # since they are scale-invariant.
40
+ # GraphicsElement -> Point
28
41
  def dimensions(Group(gs)):
29
42
  foldl(curry(dimensions2), Point(0, 0), map(coords_op, gs))
30
43
  def dimensions(Polyline(ps, _, _)):
@@ -32,25 +45,28 @@ def dimensions(Polyline(ps, _, _)):
32
45
  def dimensions(Rect(_, _, w, h, _)): Point(w, h)
33
46
  def dimensions(String(_, _, _, _, _)): Point(0, 0)
34
47
  def dimensions(Viewport(_, _, w, h, _, _, _, _, _)): Point(w, h)
48
+
35
49
  def coords_op(g):
36
50
  def (Point(x, y), Point(w, h)):
37
51
  prod(coords, dimensions, g)
38
-
39
52
  Point(x + w, y + h)
40
53
 
54
+ # GraphicsElement -> Float
41
55
  def width(g):
42
56
  def Point(w, _): dimensions(g)
43
-
44
57
  w
45
58
 
59
+ # GraphicsElement -> Float
46
60
  def height(g):
47
61
  def Point(_, h): dimensions(g)
48
-
49
62
  h
50
63
 
64
+ # Float -> Float -> List GraphicsElement -> List GraphicsElement
51
65
  def spaceRight(z, sep, gs):
52
66
  zipWith(set_x, iterate(length(gs), (+)(sep), z), gs)
53
67
 
68
+ # Bake colour decisions into the library for the time being. Provide two palettes, so we can have two
69
+ # different sets of categorical values (e.g. countries and energy types). Palettes from colorbrewer2.org
54
70
  def colours1: [
55
71
  "#66c2a5",
56
72
  "#a6d854",
@@ -73,23 +89,29 @@ def colours2: [
73
89
  "#f781bf"
74
90
  ]
75
91
 
92
+ # Compositionality principle: child coords/dimensions are always expressed directly using parent reference
93
+ # frame, to avoid depending on content of child, and so are not themselves scaled. Polyline can't be scaled
94
+ # directly because it inherits its frame of reference from its parent. For Viewport, margin will shrink the
95
+ # available area, possibly to zero, at which point nothing will be rendered.
96
+ # Float -> GraphicsElement -> GraphicsElement
76
97
  def scaleToWidth(w, Rect(x, y, _, h, fill)):
77
98
  Rect(x, y, w, h, fill)
78
99
  def scaleToWidth(w, Viewport(x, y, w0, h, fill, margin, Scale(x_scale, y_scale), translate, g)):
79
- def scale:
80
- Scale((x_scale * w) / w0, y_scale)
81
-
100
+ def scale: Scale((x_scale * w) / w0, y_scale)
82
101
  Viewport(x, y, w, h, fill, margin, scale, translate, g)
83
102
 
103
+ # Float -> List GraphicsElement -> List GraphicsElement
84
104
  def stackRight(sep, gs):
85
105
  map(scaleToWidth(1 - sep), spaceRight(sep / 2, 1, gs))
86
106
 
107
+ # Float -> List GraphicsElement -> GraphicsElement
87
108
  def groupRight(sep, gs):
88
109
  Viewport(0, 0, length(gs), maximum(map(height, gs)), "none", 0, Scale(1, 1), Translate(0, 0), Group(stackRight(sep, gs)))
89
110
 
111
+ # Heuristic saying how often to place a tick on an axis of length n.
112
+ # Float -> Float
90
113
  def tickEvery(n):
91
- def m:
92
- floor(logBase(10, n))
114
+ def m: floor(logBase(10, n))
93
115
 
94
116
  if n <= 2 * 10 ** m: 2 * 10 ** (m - 1)
95
117
  else: 10 ** m
@@ -101,47 +123,45 @@ def defaultMargin: 24
101
123
  def markerRadius: 3.5
102
124
  def tickLength: 4
103
125
 
126
+ # Helpers for axis functions.
127
+ # Orient -> Colour -> Float -> GraphicsElement
104
128
  def tick(Horiz, colour, len):
105
129
  Line(Point(0, 0), Point(0, 0 - len), colour, axisStrokeWidth)
106
130
  def tick(Vert, colour, len):
107
131
  Line(Point(0, 0), Point(0 - len, 0), colour, axisStrokeWidth)
108
132
 
133
+ # Orient -> Float -> Float -> Str -> GraphicsElement
109
134
  def label(Horiz, x, distance, str):
110
135
  String(x, (0 - distance) - 4, str, "middle", "hanging")
111
136
  def label(Vert, x, distance, str):
112
137
  String(0 - distance, x, str, "end", "central")
113
138
 
139
+ # Orient -> Colour -> Float -> Str -> GraphicsElement
114
140
  def labelledTick(orient, colour, len, str):
115
141
  Group([
116
142
  tick(orient, colour, len),
117
143
  label(orient, 0, len, str)
118
144
  ])
119
145
 
146
+ # Orient -> Float -> Float -> Point
120
147
  def mkPoint(Horiz, x, y): Point(y, x)
121
148
  def mkPoint(Vert, x, y): Point(x, y)
122
149
 
150
+ # x is position of this axis on the other axis. Returns axis and position of last tick.
151
+ # Orient -> Float -> Float -> Float -> GraphicsElement
123
152
  def axis(orient, x, start, end):
124
- def tickSp:
125
- tickEvery(end - start)
126
- def firstTick:
127
- ceilingToNearest(start, tickSp)
128
- def lastTick:
129
- ceilingToNearest(end, tickSp)
130
- def n:
131
- floor((end - firstTick) / tickSp) + 1
132
- def ys:
133
- iterate(n, (+)(tickSp), firstTick)
153
+ def tickSp: tickEvery(end - start)
154
+ def firstTick: ceilingToNearest(start, tickSp)
155
+ def lastTick: ceilingToNearest(end, tickSp)
156
+ def n: floor((end - firstTick) / tickSp) + 1
157
+ def ys: iterate(n, (+)(tickSp), firstTick)
134
158
  def ys:
135
- match firstTick > start:
136
- case True: start :| ys
137
- case False: ys
159
+ if firstTick > start: start :| ys
160
+ else: ys
138
161
  def ys:
139
- match lastTick > end:
140
- case True:
141
- concat2(ys, [lastTick])
142
- case False: ys
143
- def ps:
144
- map(mkPoint(orient, x), ys)
162
+ if lastTick > end: concat2(ys, [lastTick])
163
+ else: ys
164
+ def ps: map(mkPoint(orient, x), ys)
145
165
  def ax:
146
166
  Group([
147
167
  Line(head(ps), last(ps), axisColour, axisStrokeWidth),
@@ -150,11 +170,11 @@ def axis(orient, x, start, end):
150
170
 
151
171
  (ax, lastTick)
152
172
 
173
+ # x is position of this axis on the other axis.
174
+ # Orient -> Float -> List Cat -> GraphicsElement
153
175
  def catAxis(orient, x, catValues):
154
- def ys:
155
- iterate(length(catValues) + 1, (+)(1), 0)
156
- def ps:
157
- map(mkPoint(orient, x), ys)
176
+ def ys: iterate(length(catValues) + 1, (+)(1), 0)
177
+ def ps: map(mkPoint(orient, x), ys)
158
178
 
159
179
  Group([
160
180
  Line(head(ps), last(ps), axisColour, axisStrokeWidth),
@@ -162,14 +182,18 @@ def catAxis(orient, x, catValues):
162
182
  Polymarkers(flip(map, tail(ps), lambda Point(x, y): Point(x - 0.5, y)), map(label(orient, -0.5, 0), catValues))
163
183
  ])
164
184
 
185
+ # Float -> Float -> Float -> Float -> List GraphicsElement -> GraphicsElement
165
186
  def viewport(x_start, x_finish, y_finish, margin, gs):
166
187
  Viewport(0, 0, x_finish - x_start, y_finish, backgroundColour, margin, Scale(1, 1), Translate(0 - x_start, 0), Group(gs))
167
188
 
189
+ # Plot a map of x values to lists of (categorical value, y value) pairs. Importantly, assume all data is uniform
190
+ # (categorical keys are the same for each x value and are ordered the same each time).
191
+ # Bool -> Colours -> Float -> List (Float, List (Cat, Float)) -> GraphicsElement
168
192
  def lineChart(withAxes, colours, x_start, data):
169
193
  def xs: map(fst, data)
170
- def nCat:
171
- length(snd(head(data)))
194
+ def nCat: length(snd(head(data)))
172
195
 
196
+ # (Int, Colour) -> GraphicsElement
173
197
  def plot((n, colour)):
174
198
  def ps:
175
199
  map(lambda (x, kvs): Point(x, snd(nth(n, kvs))), data)
@@ -179,68 +203,72 @@ def lineChart(withAxes, colours, x_start, data):
179
203
  Polymarkers(ps, repeat(length(ps), Circle(0, 0, markerRadius, colour)))
180
204
  ])
181
205
 
206
+ # List GraphicsElement
182
207
  def lines:
183
208
  zipWith(curry(plot), iterate(nCat, (+)(1), 0), colours)
184
209
  def x_finish: last(xs)
185
210
  def y_finish:
186
211
  maximum(flip(map, data, lambda (_, kvs): maximum(map(snd, kvs))))
187
212
 
188
- match withAxes:
189
- case True:
190
- def (x_axis, x_finish):
191
- axis(Horiz, 0, x_start, x_finish)
192
- def (y_axis, y_finish'):
193
- axis(Vert, x_start, 0, y_finish)
194
-
195
- viewport(x_start, x_finish, y_finish', defaultMargin, x_axis :| y_axis :| lines)
196
- case False:
197
- viewport(x_start, x_finish, y_finish, 0, lines)
213
+ if withAxes:
214
+ def (x_axis, x_finish): axis(Horiz, 0, x_start, x_finish)
215
+ def (y_axis, y_finish_): axis(Vert, x_start, 0, y_finish)
216
+ viewport(x_start, x_finish, y_finish_, defaultMargin, x_axis :| y_axis :| lines)
217
+ else:
218
+ viewport(x_start, x_finish, y_finish, 0, lines)
198
219
 
220
+ # Plot a chart of categorical values on the x-axis and renderings of the corresponding a-value on the y-axis.
221
+ # (Colours -> List a -> GraphicsElement) -> Bool -> Colours -> Float -> List (Cat, a) -> GraphicsElement
199
222
  def categoricalChart(plotValue, withAxes, colours, sep, data):
200
223
  def gs:
201
224
  stackRight(sep, plotValue(colours, map(snd, data)))
202
225
  def w: length(gs)
203
- def h:
204
- maximum(map(height, gs))
205
-
206
- match withAxes:
207
- case True:
208
- def x_axis:
209
- catAxis(Horiz, 0, map(fst, data))
210
- def (y_axis, h'): axis(Vert, 0, 0, h)
226
+ def h: maximum(map(height, gs))
211
227
 
212
- viewport(0, w, h', defaultMargin, concat2(gs, [x_axis, y_axis]))
213
- case False:
214
- viewport(0, w, h, 0, gs)
228
+ if withAxes:
229
+ def x_axis: catAxis(Horiz, 0, map(fst, data))
230
+ def (y_axis, h_): axis(Vert, 0, 0, h)
231
+ viewport(0, w, h_, defaultMargin, concat2(gs, [x_axis, y_axis]))
232
+ else:
233
+ viewport(0, w, h, 0, gs)
215
234
 
235
+ # Colours -> List a -> GraphicsElement
216
236
  def rects(colours, ns):
217
237
  zipWith(lambda colour, n: Rect(0, 0, 1, n, colour), colours, ns)
218
238
 
239
+ # First component of data (categorical value) currently ignored; values just mapped positionally to colors.
240
+ # Can we use Group instead of Viewport here?
241
+ # Colours -> List (a, Num) -> GraphicsElement
219
242
  def stackedBar(colours, ns):
220
243
  def heights: map(snd, ns)
221
- def subtotals:
222
- scanl1((+), 0, heights)
223
- def dims:
224
- zip(0 :| subtotals, heights)
244
+ def subtotals: scanl1((+), 0, heights)
245
+ def dims: zip(0 :| subtotals, heights)
225
246
  def rects:
226
247
  map(lambda ((y, height), colour): Rect(0, y, 1, height, colour), zip(dims, colours))
227
248
 
228
249
  Viewport(0, 0, 1, last(subtotals), "none", 0, Scale(1, 1), Translate(0, 0), Group(rects))
229
250
 
251
+ # Bool -> Colours -> Float -> List (a, Float) -> GraphicsElement
230
252
  def barChart:
231
253
  categoricalChart(rects)
232
254
 
255
+ # For each categorical value of type a, plot a bar chart for the corresponding b-indexed data.
256
+ # Bool -> Colours -> Float -> List (a, List (b, Float)) -> GraphicsElement
233
257
  def groupedBarChart:
234
258
  categoricalChart(compose(map, flip(barChart(False), 0)))
235
259
 
260
+ # See stackedBar for strong (unjustified) assumption about uniformity of data.
261
+ # Bool -> Colours -> Num -> List (a, List (b, Num)) -> GraphicsElement
236
262
  def stackedBarChart:
237
263
  categoricalChart(compose(map, stackedBar))
238
264
 
265
+ # Bit of a hack, but how text fits into our model is a bit unclear at the moment.
266
+ # Str -> GraphicsElement -> GraphicsElement
239
267
  def caption(str, Viewport(x, y, w, h, fill, margin, scale, translate, g)):
240
- def g':
268
+ def g_:
241
269
  Group([
242
270
  String(x + w / 2, -2, str, "middle", "hanging"),
243
271
  Viewport(0, 0, w, h, fill, margin, scale, translate, g)
244
272
  ])
245
273
 
246
- Viewport(x, y, w, h, backgroundColour, defaultMargin / 2 + 4, Scale(1, 1), Translate(0, 0), g')
274
+ Viewport(x, y, w, h, backgroundColour, defaultMargin / 2 + 4, Scale(1, 1), Translate(0, 0), g_)
@@ -10312,6 +10312,7 @@ var inlinable = (m) => (doc) => {
10312
10312
  }
10313
10313
  fail();
10314
10314
  };
10315
+ var expr = /* @__PURE__ */ Mode(Expr);
10315
10316
  var format = (m) => (w) => (doc) => {
10316
10317
  if (inlinable(m)(doc) && width(m)(doc) < (80 - w | 0)) {
10317
10318
  return Inline;
@@ -10371,9 +10372,8 @@ var renderWithIndent = (m) => (i) => (w) => (doc) => {
10371
10372
  }
10372
10373
  fail();
10373
10374
  };
10374
- var expr = /* @__PURE__ */ Mode(Expr);
10375
10375
 
10376
- // output-es/Pretty.Helpers/index.js
10376
+ // output-es/Pretty.Util/index.js
10377
10377
  var vsep = (v) => {
10378
10378
  if (v.tag === "Nil") {
10379
10379
  return Empty;
@@ -18933,12 +18933,6 @@ var isHexDigit = (c) => {
18933
18933
  var isAlphaNum = (x) => checkAttr([524288, 512, 4096, 1048576, 16384, 8388608, 4194304, 2097152, 131072, 256, 16777216])(x);
18934
18934
  var isAlpha = (x) => checkAttr([4096, 512, 524288, 1048576, 16384])(x);
18935
18935
 
18936
- // output-es/Parse.Error/index.js
18937
- var prettyParseError = (v) => "ParseError on line " + showIntImpl(v._2.line) + ", column " + showIntImpl(v._2.column) + ":\n" + v._1;
18938
-
18939
- // output-es/Parse.Constants/index.js
18940
- var opChars = [":", "!", "#", "$", "%", "&", "*", "+", ".", "/", "<", "=", ">", "?", "@", "\\", "^", "|", "-", "~"];
18941
-
18942
18936
  // output-es/Parsing.Combinators.Array/index.js
18943
18937
  var many2 = (p) => {
18944
18938
  const $0 = monadRecParserT.tailRecM((xs) => (v2, $02, $1, $2, $3) => {
@@ -19304,7 +19298,8 @@ var stringChar = /* @__PURE__ */ withErrorMessage((state1, more, lift12, $$throw
19304
19298
  $$throw2,
19305
19299
  (state2, a) => more((v2) => done(state2, $Maybe("Just", a)))
19306
19300
  )))("string character");
19307
- var lexeme = (p) => (state1, more, lift12, $$throw2, done) => more((v2) => more((v1) => p(
19301
+ var opChars = [":", "!", "#", "$", "%", "&", "*", "+", ".", "/", "<", "=", ">", "?", "@", "\\", "^", "|", "-", "~"];
19302
+ var lexeme = (v) => (state1, more, lift12, $$throw2, done) => more((v2) => more((v1) => v(
19308
19303
  state1,
19309
19304
  more,
19310
19305
  lift12,
@@ -19361,7 +19356,7 @@ var stringLiteral = /* @__PURE__ */ lexeme(/* @__PURE__ */ withErrorMessage(/* @
19361
19356
  ))
19362
19357
  ));
19363
19358
  })())("literal string"));
19364
- var keywords = ["def", "if", "else", "lambda", "match", "case", "for", "in"];
19359
+ var keywords = ["case", "def", "else", "for", "if", "import", "in", "lambda", "match"];
19365
19360
  var unreserved = (p) => (state1, more, lift12, $$throw2, done) => more((v1) => p(
19366
19361
  state1,
19367
19362
  more,
@@ -20101,7 +20096,7 @@ var topLevel = (p) => (state1, more, lift12, $$throw2, done) => more((v2) => mor
20101
20096
  var parse = (parser) => (input) => {
20102
20097
  const $0 = runParserT2(input)(parser)(initialPos)._1;
20103
20098
  if ($0.tag === "Left") {
20104
- return $Either("Left", prettyParseError($0._1));
20099
+ return $Either("Left", "ParseError on line " + showIntImpl($0._1._2.line) + ", column " + showIntImpl($0._1._2.column) + ":\n" + $0._1._1);
20105
20100
  }
20106
20101
  if ($0.tag === "Right") {
20107
20102
  return $Either("Right", $0._1);
@@ -24025,6 +24025,45 @@ var nubBy = (comp) => (xs) => {
24025
24025
  }
24026
24026
  return [];
24027
24027
  };
24028
+ var transpose = (xs) => {
24029
+ const go = (go$a0$copy) => (go$a1$copy) => {
24030
+ let go$a0 = go$a0$copy, go$a1 = go$a1$copy, go$c = true, go$r;
24031
+ while (go$c) {
24032
+ const idx = go$a0, allArrays = go$a1;
24033
+ const v = foldlArray((acc) => (nextArr) => {
24034
+ if (idx >= 0 && idx < nextArr.length) {
24035
+ const $0 = nextArr[idx];
24036
+ return $Maybe(
24037
+ "Just",
24038
+ (() => {
24039
+ if (acc.tag === "Nothing") {
24040
+ return [$0];
24041
+ }
24042
+ if (acc.tag === "Just") {
24043
+ return snoc(acc._1)($0);
24044
+ }
24045
+ fail();
24046
+ })()
24047
+ );
24048
+ }
24049
+ return acc;
24050
+ })(Nothing)(xs);
24051
+ if (v.tag === "Nothing") {
24052
+ go$c = false;
24053
+ go$r = allArrays;
24054
+ continue;
24055
+ }
24056
+ if (v.tag === "Just") {
24057
+ go$a0 = idx + 1 | 0;
24058
+ go$a1 = snoc(allArrays)(v._1);
24059
+ continue;
24060
+ }
24061
+ fail();
24062
+ }
24063
+ return go$r;
24064
+ };
24065
+ return go(0)([]);
24066
+ };
24028
24067
  var foldM = (dictMonad) => (f) => (b) => ($0) => unconsImpl((v) => dictMonad.Applicative0().pure(b), (a) => (as) => dictMonad.Bind1().bind(f(b)(a))((b$p) => foldM(dictMonad)(f)(b$p)(as)), $0);
24029
24068
  var elem = (dictEq) => (a) => (arr) => {
24030
24069
  const $0 = findIndexImpl(Just, Nothing, (v) => dictEq.eq(v)(a), arr);
@@ -27856,7 +27895,7 @@ var renderWithIndent = (m) => (i) => (w) => (doc2) => {
27856
27895
  fail();
27857
27896
  };
27858
27897
 
27859
- // output-es/Pretty.Helpers/index.js
27898
+ // output-es/Pretty.Util/index.js
27860
27899
  var sep$p = (v) => (v1) => {
27861
27900
  if (v1.tag === "Nil") {
27862
27901
  return Empty;
@@ -43386,47 +43425,6 @@ var toStringWith = (v) => {
43386
43425
  fail();
43387
43426
  };
43388
43427
 
43389
- // output-es/Util.Array/index.js
43390
- var transpose2 = (xs) => {
43391
- const go = (go$a0$copy) => (go$a1$copy) => {
43392
- let go$a0 = go$a0$copy, go$a1 = go$a1$copy, go$c = true, go$r;
43393
- while (go$c) {
43394
- const idx = go$a0, allArrays = go$a1;
43395
- const v = foldlArray((acc) => (nextArr) => {
43396
- if (idx >= 0 && idx < nextArr.length) {
43397
- const $0 = nextArr[idx];
43398
- return $Maybe(
43399
- "Just",
43400
- (() => {
43401
- if (acc.tag === "Nothing") {
43402
- return [$0];
43403
- }
43404
- if (acc.tag === "Just") {
43405
- return snoc(acc._1)($0);
43406
- }
43407
- fail();
43408
- })()
43409
- );
43410
- }
43411
- return acc;
43412
- })(Nothing)(xs);
43413
- if (v.tag === "Nothing") {
43414
- go$c = false;
43415
- go$r = allArrays;
43416
- continue;
43417
- }
43418
- if (v.tag === "Just") {
43419
- go$a0 = idx + 1 | 0;
43420
- go$a1 = snoc(allArrays)(v._1);
43421
- continue;
43422
- }
43423
- fail();
43424
- }
43425
- return go$r;
43426
- };
43427
- return go(0)([]);
43428
- };
43429
-
43430
43428
  // output-es/App.View.TableView/index.js
43431
43429
  var toUnfoldable6 = /* @__PURE__ */ (() => {
43432
43430
  const $0 = unfoldableArray.unfoldr((xs) => {
@@ -43619,7 +43617,7 @@ var viewableTableViewUnit = {
43619
43617
  fail();
43620
43618
  };
43621
43619
  const $3 = selectAll2(".table-row")(rootElement);
43622
- const column_isVisible = arrayMap(any(visible($0.length >= 10 ? Interactive : Everything)))(transpose2($1));
43620
+ const column_isVisible = arrayMap(any(visible($0.length >= 10 ? Interactive : Everything)))(transpose($1));
43623
43621
  const column_visiblePred = (column_visiblePred$a0$copy) => {
43624
43622
  let column_visiblePred$a0 = column_visiblePred$a0$copy, column_visiblePred$c = true, column_visiblePred$r;
43625
43623
  while (column_visiblePred$c) {
@@ -46975,12 +46973,6 @@ var isHexDigit = (c) => {
46975
46973
  var isAlphaNum = (x2) => checkAttr([524288, 512, 4096, 1048576, 16384, 8388608, 4194304, 2097152, 131072, 256, 16777216])(x2);
46976
46974
  var isAlpha = (x2) => checkAttr([4096, 512, 524288, 1048576, 16384])(x2);
46977
46975
 
46978
- // output-es/Parse.Error/index.js
46979
- var prettyParseError = (v) => "ParseError on line " + showIntImpl(v._2.line) + ", column " + showIntImpl(v._2.column) + ":\n" + v._1;
46980
-
46981
- // output-es/Parse.Constants/index.js
46982
- var opChars = [":", "!", "#", "$", "%", "&", "*", "+", ".", "/", "<", "=", ">", "?", "@", "\\", "^", "|", "-", "~"];
46983
-
46984
46976
  // output-es/Parsing.Combinators.Array/index.js
46985
46977
  var many2 = (p) => {
46986
46978
  const $0 = monadRecParserT.tailRecM((xs) => (v2, $02, $1, $2, $3) => {
@@ -47341,7 +47333,8 @@ var stringChar = /* @__PURE__ */ withErrorMessage((state1, more, lift12, $$throw
47341
47333
  $$throw2,
47342
47334
  (state2, a) => more((v2) => done(state2, $Maybe("Just", a)))
47343
47335
  )))("string character");
47344
- var lexeme = (p) => (state1, more, lift12, $$throw2, done) => more((v2) => more((v1) => p(
47336
+ var opChars = [":", "!", "#", "$", "%", "&", "*", "+", ".", "/", "<", "=", ">", "?", "@", "\\", "^", "|", "-", "~"];
47337
+ var lexeme = (v) => (state1, more, lift12, $$throw2, done) => more((v2) => more((v1) => v(
47345
47338
  state1,
47346
47339
  more,
47347
47340
  lift12,
@@ -47398,7 +47391,7 @@ var stringLiteral = /* @__PURE__ */ lexeme(/* @__PURE__ */ withErrorMessage(/* @
47398
47391
  ))
47399
47392
  ));
47400
47393
  })())("literal string"));
47401
- var keywords = ["def", "if", "else", "lambda", "match", "case", "for", "in"];
47394
+ var keywords = ["case", "def", "else", "for", "if", "import", "in", "lambda", "match"];
47402
47395
  var unreserved = (p) => (state1, more, lift12, $$throw2, done) => more((v1) => p(
47403
47396
  state1,
47404
47397
  more,
@@ -48138,7 +48131,7 @@ var topLevel = (p) => (state1, more, lift12, $$throw2, done) => more((v2) => mor
48138
48131
  var parse = (parser2) => (input) => {
48139
48132
  const $0 = runParserT2(input)(parser2)(initialPos)._1;
48140
48133
  if ($0.tag === "Left") {
48141
- return $Either("Left", prettyParseError($0._1));
48134
+ return $Either("Left", "ParseError on line " + showIntImpl($0._1._2.line) + ", column " + showIntImpl($0._1._2.column) + ":\n" + $0._1._1);
48142
48135
  }
48143
48136
  if ($0.tag === "Right") {
48144
48137
  return $Either("Right", $0._1);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@explorable-viz/fluid",
3
- "version": "0.11.2",
3
+ "version": "0.11.4",
4
4
  "description": "A functional programming language which integrates a bidirectional dynamic analysis, connecting outputs to data sources in a fine-grained way. Fluid is implemented in PureScript and runs in the browser.",
5
5
  "main": "index.js",
6
6
  "repository": {
@@ -75,7 +75,7 @@
75
75
  "karma-mocha": "2.0.1",
76
76
  "karma-mocha-reporter": "2.2.5",
77
77
  "mocha": "^10.0.0",
78
- "puppeteer": "^23.2.0",
78
+ "puppeteer": "23.11.1",
79
79
  "purescript": "0.15.10",
80
80
  "purescript-language-server": "0.16.6",
81
81
  "purescript-psa": "0.8.2",
@@ -19,9 +19,8 @@ def convolve(image, kernel):
19
19
  def area: i * j
20
20
 
21
21
  def interMatrix(m_, n_):
22
- # @doc(f"""average these values to compute element""")
23
- [| kernel!(i_, j_) *
24
- lookup(m_ + i_ - 1 - half_i, n_ + j_ - 1 - half_j, image)
22
+ @doc(f"""average these to compute element ({m_}, {n_})""")
23
+ [| lookup(m_ + i_ - 1 - half_i, n_ + j_ - 1 - half_j, image) * kernel!(i_, j_)
25
24
  for (i_, j_) in (i, j) |]
26
25
 
27
26
  [| matrixSum(interMatrix(m_, n_)) |quot| area for (m_, n_) in (m, n) |]
@@ -1,2 +1,2 @@
1
1
  def tableData:
2
- loadJson("/dataset/SciGen/1805.02474v1-10.json")
2
+ loadJson("../dataset/SciGen/1805.02474v1-10.json")
@@ -1 +1 @@
1
- def methane: loadJson("/dataset/methane-emissions.json")
1
+ def methane: loadJson("../dataset/methane-emissions.json")
@@ -1,5 +1,5 @@
1
1
  def nonRenewables:
2
- loadJson("/dataset/non-renewables.json")
2
+ loadJson("../dataset/non-renewables.json")
3
3
 
4
4
  def renewables:
5
- loadJson("/dataset/renewable.json")
5
+ loadJson("../dataset/renewable.json")
@@ -1 +1 @@
1
- def renewables: loadJson("/dataset/renewable-new.json")
1
+ def renewables: loadJson("../dataset/renewable-new.json")
@@ -1,44 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <meta http-equiv="X-UA-Compatible" content="ie=edge">
7
- <title>Some publications</title>
8
- <link href="css/styles.css" rel="stylesheet" type="text/css">
9
- <script src="https://kit.fontawesome.com/20cf8b42c0.js" crossorigin="anonymous"></script>
10
- </head>
11
- <body>
12
-
13
- <div class="grid-container double-size">
14
- <div></div>
15
- <div></div>
16
- <div class="flex-left-align">
17
- <div></div>
18
- <h2>Preprints</h2>
19
-
20
- <a href="https://dynamicaspects.org/papers/authoring-assistant.pdf">AI-Assisted Authoring for Transparent, Data-Driven Documents</a>
21
- Alfonso Piscitelli, Cristina David, Mattia De Rosa, Ali Muhammad, Federico Nanni, Jacob Pake, Roly Perera, Jessy Sodimu, Chenyiqiu Zheng
22
- <br>(Under review)
23
- <br><br>
24
- <a href="https://bentnib.org/galois-autodiff.pdf">
25
- <strong>Galois Slicing as Automatic Differentiation</strong>
26
- </a>
27
- Robert Atkey, Roly Perera
28
- <br>(Under review)
29
-
30
- <h2>Recent papers</h2>
31
- <a href="https://link.springer.com/chapter/10.1007/978-3-031-91118-7_6">
32
- Cognacy Queries over Dependence Graphs for Transparent Visualisations
33
- </a>
34
- Joseph Bond, Cristina David, Minh Nguyen, Dominic Orchard, Roly Perera
35
- <br>European Symposium on Programming (ESOP 2025)
36
- <br><br>
37
- <a href="https://arxiv.org/abs/2109.00445">Linked Visualisations via Galois Dependencies</a>
38
- Roly Perera, Minh Nguyen, Tomas Petricek, Meng Wang
39
- <br>
40
- ACM SIGPLAN Conference on Principles of Programming Languages (POPL 2022)
41
- </div>
42
- </div>
43
- </body>
44
- </html>