Skip to content

Instantly share code, notes, and snippets.

@jfmengels
Created June 14, 2025 20:58
Show Gist options
  • Save jfmengels/5d5790e32f22ffd32e0e58b8ba26438f to your computer and use it in GitHub Desktop.
Save jfmengels/5d5790e32f22ffd32e0e58b8ba26438f to your computer and use it in GitHub Desktop.
Terrible code generation with pattern matching and recursion

Here's an example of an Elm function that when compiled becomes a horrendously long and convoluted function.

The function in question is compareExpression in ExpressionDict.elm. The result of compiling code that references the function (through elm make --optimize) is in elm.js, though only that function has been selected. The result of minifying that function is available in elm.min.js

# Install if necessary
# npm install uglify-js --global
uglifyjs elm.js --compress 'pure_funcs=[F2,F3,F4,F5,F6,F7,F8,F9,A2,A3,A4,A5,A6,A7,A8,A9],pure_getters,keep_fargs=false,unsafe_comps,unsafe' --output elm.min.js

Explanation

The idea of the function is to be able to compare two Expressions so that they can be sorted into a tree-like structure (specifically, owanturist/elm-avl-dict).

It does so through a lot of pattern matching, and recursion to compare sub-expressions.

var $author$project$ExpressionDict$compareExpression = F2(function $author$project$ExpressionDict$compareExpression$fn(_v15, _v16) {
compareExpression:
while (true) {
var l = _v15.b;
var r = _v16.b;
var _v17 = _Utils_Tuple2(l, r);
_v17$1:
while (true) {
_v17$2:
while (true) {
_v17$4:
while (true) {
_v17$5:
while (true) {
_v17$7:
while (true) {
_v17$8:
while (true) {
_v17$10:
while (true) {
_v17$11:
while (true) {
_v17$13:
while (true) {
_v17$14:
while (true) {
_v17$16:
while (true) {
_v17$17:
while (true) {
_v17$19:
while (true) {
_v17$20:
while (true) {
_v17$22:
while (true) {
_v17$23:
while (true) {
_v17$25:
while (true) {
_v17$26:
while (true) {
_v17$28:
while (true) {
_v17$29:
while (true) {
_v17$31:
while (true) {
_v17$32:
while (true) {
_v17$34:
while (true) {
_v17$35:
while (true) {
_v17$37:
while (true) {
_v17$38:
while (true) {
_v17$40:
while (true) {
_v17$41:
while (true) {
_v17$43:
while (true) {
_v17$44:
while (true) {
_v17$46:
while (true) {
_v17$47:
while (true) {
_v17$49:
while (true) {
_v17$50:
while (true) {
_v17$52:
while (true) {
_v17$53:
while (true) {
_v17$55:
while (true) {
_v17$56:
while (true) {
_v17$58:
while (true) {
_v17$59:
while (true) {
_v17$61:
while (true) {
_v17$62:
while (true) {
_v17$64:
while (true) {
_v17$65:
while (true) {
switch (_v17.a.$) {
case 0:
switch (_v17.b.$) {
case 0:
var _v18 = _v17.a;
var _v19 = _v17.b;
return 1;
case 13:
break _v17$1;
case 1:
break _v17$1;
case 2:
break _v17$1;
case 3:
break _v17$1;
case 4:
break _v17$1;
case 5:
break _v17$1;
case 6:
break _v17$1;
case 7:
break _v17$1;
case 8:
break _v17$1;
case 9:
break _v17$1;
case 10:
break _v17$1;
case 11:
break _v17$1;
case 12:
break _v17$1;
case 14:
break _v17$1;
case 19:
break _v17$1;
case 18:
break _v17$1;
case 15:
break _v17$1;
case 16:
break _v17$1;
case 17:
break _v17$1;
case 20:
break _v17$1;
case 21:
break _v17$1;
case 22:
break _v17$1;
default:
break _v17$1;
}
case 13:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
var lc = _v17.a.a;
var rc = _v17.b.a;
return A3($author$project$ExpressionDict$compareList, $author$project$ExpressionDict$compareExpression, lc, rc);
case 1:
break _v17$4;
case 2:
break _v17$4;
case 3:
break _v17$4;
case 4:
break _v17$4;
case 5:
break _v17$4;
case 6:
break _v17$4;
case 7:
break _v17$4;
case 8:
break _v17$4;
case 9:
break _v17$4;
case 10:
break _v17$4;
case 11:
break _v17$4;
case 12:
break _v17$4;
case 14:
break _v17$4;
case 19:
break _v17$4;
case 18:
break _v17$4;
case 15:
break _v17$4;
case 16:
break _v17$4;
case 17:
break _v17$4;
case 20:
break _v17$4;
case 21:
break _v17$4;
case 22:
break _v17$4;
default:
break _v17$4;
}
case 1:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
var lc = _v17.a.a;
var rc = _v17.b.a;
return A3($author$project$ExpressionDict$compareList, $author$project$ExpressionDict$compareExpression, lc, rc);
case 2:
break _v17$7;
case 3:
break _v17$7;
case 4:
break _v17$7;
case 5:
break _v17$7;
case 6:
break _v17$7;
case 7:
break _v17$7;
case 8:
break _v17$7;
case 9:
break _v17$7;
case 10:
break _v17$7;
case 11:
break _v17$7;
case 12:
break _v17$7;
case 14:
break _v17$7;
case 19:
break _v17$7;
case 18:
break _v17$7;
case 15:
break _v17$7;
case 16:
break _v17$7;
case 17:
break _v17$7;
case 20:
break _v17$7;
case 21:
break _v17$7;
case 22:
break _v17$7;
default:
break _v17$7;
}
case 2:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
var _v22 = _v17.a;
var lo = _v22.a;
var ll = _v22.c;
var lr = _v22.d;
var _v23 = _v17.b;
var ro = _v23.a;
var rl = _v23.c;
var rr = _v23.d;
var _v24 = A2($elm$core$Basics$compare, lo, ro);
if (_v24 === 1) {
return A3(
$author$project$ExpressionDict$compareList,
$author$project$ExpressionDict$compareExpression,
_List_fromArray(
[ll, lr]),
_List_fromArray(
[rl, rr]));
} else {
var res = _v24;
return res;
}
case 3:
break _v17$10;
case 4:
break _v17$10;
case 5:
break _v17$10;
case 6:
break _v17$10;
case 7:
break _v17$10;
case 8:
break _v17$10;
case 9:
break _v17$10;
case 10:
break _v17$10;
case 11:
break _v17$10;
case 12:
break _v17$10;
case 14:
break _v17$10;
case 19:
break _v17$10;
case 18:
break _v17$10;
case 15:
break _v17$10;
case 16:
break _v17$10;
case 17:
break _v17$10;
case 20:
break _v17$10;
case 21:
break _v17$10;
case 22:
break _v17$10;
default:
break _v17$10;
}
case 3:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
var _v27 = _v17.a;
var lmod = _v27.a;
var lname = _v27.b;
var _v28 = _v17.b;
var rmod = _v28.a;
var rname = _v28.b;
var _v29 = A2($elm$core$Basics$compare, lmod, rmod);
if (_v29 === 1) {
return A2($elm$core$Basics$compare, lname, rname);
} else {
var res = _v29;
return res;
}
case 4:
break _v17$13;
case 5:
break _v17$13;
case 6:
break _v17$13;
case 7:
break _v17$13;
case 8:
break _v17$13;
case 9:
break _v17$13;
case 10:
break _v17$13;
case 11:
break _v17$13;
case 12:
break _v17$13;
case 14:
break _v17$13;
case 19:
break _v17$13;
case 18:
break _v17$13;
case 15:
break _v17$13;
case 16:
break _v17$13;
case 17:
break _v17$13;
case 20:
break _v17$13;
case 21:
break _v17$13;
case 22:
break _v17$13;
default:
break _v17$13;
}
case 4:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
var _v32 = _v17.a;
var lc = _v32.a;
var lt = _v32.b;
var lf = _v32.c;
var _v33 = _v17.b;
var rc = _v33.a;
var rt = _v33.b;
var rf = _v33.c;
return A3(
$author$project$ExpressionDict$compareList,
$author$project$ExpressionDict$compareExpression,
_List_fromArray(
[lc, lt, lf]),
_List_fromArray(
[rc, rt, rf]));
case 5:
break _v17$16;
case 6:
break _v17$16;
case 7:
break _v17$16;
case 8:
break _v17$16;
case 9:
break _v17$16;
case 10:
break _v17$16;
case 11:
break _v17$16;
case 12:
break _v17$16;
case 14:
break _v17$16;
case 19:
break _v17$16;
case 18:
break _v17$16;
case 15:
break _v17$16;
case 16:
break _v17$16;
case 17:
break _v17$16;
case 20:
break _v17$16;
case 21:
break _v17$16;
case 22:
break _v17$16;
default:
break _v17$16;
}
case 5:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
var lo = _v17.a.a;
var ro = _v17.b.a;
return A2($elm$core$Basics$compare, lo, ro);
case 6:
break _v17$19;
case 7:
break _v17$19;
case 8:
break _v17$19;
case 9:
break _v17$19;
case 10:
break _v17$19;
case 11:
break _v17$19;
case 12:
break _v17$19;
case 14:
break _v17$19;
case 19:
break _v17$19;
case 18:
break _v17$19;
case 15:
break _v17$19;
case 16:
break _v17$19;
case 17:
break _v17$19;
case 20:
break _v17$19;
case 21:
break _v17$19;
case 22:
break _v17$19;
default:
break _v17$19;
}
case 6:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
var lo = _v17.a.a;
var ro = _v17.b.a;
return A2($elm$core$Basics$compare, lo, ro);
case 7:
break _v17$22;
case 8:
break _v17$22;
case 9:
break _v17$22;
case 10:
break _v17$22;
case 11:
break _v17$22;
case 12:
break _v17$22;
case 14:
break _v17$22;
case 19:
break _v17$22;
case 18:
break _v17$22;
case 15:
break _v17$22;
case 16:
break _v17$22;
case 17:
break _v17$22;
case 20:
break _v17$22;
case 21:
break _v17$22;
case 22:
break _v17$22;
default:
break _v17$22;
}
case 7:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
var li = _v17.a.a;
var ri = _v17.b.a;
return A2($elm$core$Basics$compare, li, ri);
case 8:
break _v17$25;
case 9:
break _v17$25;
case 10:
break _v17$25;
case 11:
break _v17$25;
case 12:
break _v17$25;
case 14:
break _v17$25;
case 19:
break _v17$25;
case 18:
break _v17$25;
case 15:
break _v17$25;
case 16:
break _v17$25;
case 17:
break _v17$25;
case 20:
break _v17$25;
case 21:
break _v17$25;
case 22:
break _v17$25;
default:
break _v17$25;
}
case 8:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
var lh = _v17.a.a;
var rh = _v17.b.a;
return A2($elm$core$Basics$compare, lh, rh);
case 9:
break _v17$28;
case 10:
break _v17$28;
case 11:
break _v17$28;
case 12:
break _v17$28;
case 14:
break _v17$28;
case 19:
break _v17$28;
case 18:
break _v17$28;
case 15:
break _v17$28;
case 16:
break _v17$28;
case 17:
break _v17$28;
case 20:
break _v17$28;
case 21:
break _v17$28;
case 22:
break _v17$28;
default:
break _v17$28;
}
case 9:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
var lf = _v17.a.a;
var rf = _v17.b.a;
return A2($elm$core$Basics$compare, lf, rf);
case 10:
break _v17$31;
case 11:
break _v17$31;
case 12:
break _v17$31;
case 14:
break _v17$31;
case 19:
break _v17$31;
case 18:
break _v17$31;
case 15:
break _v17$31;
case 16:
break _v17$31;
case 17:
break _v17$31;
case 20:
break _v17$31;
case 21:
break _v17$31;
case 22:
break _v17$31;
default:
break _v17$31;
}
case 10:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
var lc = _v17.a.a;
var rc = _v17.b.a;
var $temp$_v15 = lc,
$temp$_v16 = rc;
_v15 = $temp$_v15;
_v16 = $temp$_v16;
continue compareExpression;
case 11:
break _v17$34;
case 12:
break _v17$34;
case 14:
break _v17$34;
case 19:
break _v17$34;
case 18:
break _v17$34;
case 15:
break _v17$34;
case 16:
break _v17$34;
case 17:
break _v17$34;
case 20:
break _v17$34;
case 21:
break _v17$34;
case 22:
break _v17$34;
default:
break _v17$34;
}
case 11:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
var ll = _v17.a.a;
var rl = _v17.b.a;
return A2($elm$core$Basics$compare, ll, rl);
case 12:
break _v17$37;
case 14:
break _v17$37;
case 19:
break _v17$37;
case 18:
break _v17$37;
case 15:
break _v17$37;
case 16:
break _v17$37;
case 17:
break _v17$37;
case 20:
break _v17$37;
case 21:
break _v17$37;
case 22:
break _v17$37;
default:
break _v17$37;
}
case 12:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
var ll = _v17.a.a;
var rl = _v17.b.a;
return A2($elm$core$Basics$compare, ll, rl);
case 14:
break _v17$40;
case 19:
break _v17$40;
case 18:
break _v17$40;
case 15:
break _v17$40;
case 16:
break _v17$40;
case 17:
break _v17$40;
case 20:
break _v17$40;
case 21:
break _v17$40;
case 22:
break _v17$40;
default:
break _v17$40;
}
case 14:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
break _v17$41;
case 14:
var lc = _v17.a.a;
var rc = _v17.b.a;
var $temp$_v15 = lc,
$temp$_v16 = rc;
_v15 = $temp$_v15;
_v16 = $temp$_v16;
continue compareExpression;
case 19:
break _v17$43;
case 18:
break _v17$43;
case 15:
break _v17$43;
case 16:
break _v17$43;
case 17:
break _v17$43;
case 20:
break _v17$43;
case 21:
break _v17$43;
case 22:
break _v17$43;
default:
break _v17$43;
}
case 19:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
break _v17$41;
case 14:
break _v17$44;
case 19:
var lc = _v17.a.a;
var rc = _v17.b.a;
return A3($author$project$ExpressionDict$compareList, $author$project$ExpressionDict$compareExpression, lc, rc);
case 18:
break _v17$46;
case 15:
break _v17$46;
case 16:
break _v17$46;
case 17:
break _v17$46;
case 20:
break _v17$46;
case 21:
break _v17$46;
case 22:
break _v17$46;
default:
break _v17$46;
}
case 18:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
break _v17$41;
case 14:
break _v17$44;
case 19:
break _v17$47;
case 18:
var lc = _v17.a.a;
var rc = _v17.b.a;
return A3($author$project$ExpressionDict$compareList, $author$project$ExpressionDict$compareRecordSetter, lc, rc);
case 15:
break _v17$49;
case 16:
break _v17$49;
case 17:
break _v17$49;
case 20:
break _v17$49;
case 21:
break _v17$49;
case 22:
break _v17$49;
default:
break _v17$49;
}
case 15:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
break _v17$41;
case 14:
break _v17$44;
case 19:
break _v17$47;
case 18:
break _v17$50;
case 15:
var lc = _v17.a.a;
var rc = _v17.b.a;
return A2($author$project$ExpressionDict$compareLetBlocks, lc, rc);
case 16:
break _v17$52;
case 17:
break _v17$52;
case 20:
break _v17$52;
case 21:
break _v17$52;
case 22:
break _v17$52;
default:
break _v17$52;
}
case 16:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
break _v17$41;
case 14:
break _v17$44;
case 19:
break _v17$47;
case 18:
break _v17$50;
case 15:
break _v17$53;
case 16:
var lc = _v17.a.a;
var rc = _v17.b.a;
return A2($author$project$ExpressionDict$compareCaseBlocks, lc, rc);
case 17:
break _v17$55;
case 20:
break _v17$55;
case 21:
break _v17$55;
case 22:
break _v17$55;
default:
break _v17$55;
}
case 17:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
break _v17$41;
case 14:
break _v17$44;
case 19:
break _v17$47;
case 18:
break _v17$50;
case 15:
break _v17$53;
case 16:
break _v17$56;
case 17:
var lc = _v17.a.a;
var rc = _v17.b.a;
return A2($author$project$ExpressionDict$compareLambda, lc, rc);
case 20:
break _v17$58;
case 21:
break _v17$58;
case 22:
break _v17$58;
default:
break _v17$58;
}
case 20:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
break _v17$41;
case 14:
break _v17$44;
case 19:
break _v17$47;
case 18:
break _v17$50;
case 15:
break _v17$53;
case 16:
break _v17$56;
case 17:
break _v17$59;
case 20:
var _v36 = _v17.a;
var ln = _v36.a;
var _v37 = _v36.b;
var lf = _v37.b;
var _v38 = _v17.b;
var rn = _v38.a;
var _v39 = _v38.b;
var rf = _v39.b;
var _v40 = A2($author$project$ExpressionDict$compareExpression, ln, rn);
if (_v40 === 1) {
return A2($elm$core$Basics$compare, lf, rf);
} else {
var res = _v40;
return res;
}
case 21:
break _v17$61;
case 22:
break _v17$61;
default:
break _v17$61;
}
case 21:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
break _v17$41;
case 14:
break _v17$44;
case 19:
break _v17$47;
case 18:
break _v17$50;
case 15:
break _v17$53;
case 16:
break _v17$56;
case 17:
break _v17$59;
case 20:
break _v17$62;
case 21:
var lf = _v17.a.a;
var rf = _v17.b.a;
return A2($elm$core$Basics$compare, lf, rf);
case 22:
break _v17$64;
default:
break _v17$64;
}
case 22:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
break _v17$41;
case 14:
break _v17$44;
case 19:
break _v17$47;
case 18:
break _v17$50;
case 15:
break _v17$53;
case 16:
break _v17$56;
case 17:
break _v17$59;
case 20:
break _v17$62;
case 21:
break _v17$65;
case 22:
var _v43 = _v17.a;
var _v44 = _v43.a;
var ln = _v44.b;
var lc = _v43.b;
var _v45 = _v17.b;
var _v46 = _v45.a;
var rn = _v46.b;
var rc = _v45.b;
var _v47 = A2($elm$core$Basics$compare, ln, rn);
if (_v47 === 1) {
return A3($author$project$ExpressionDict$compareList, $author$project$ExpressionDict$compareRecordSetter, lc, rc);
} else {
var res = _v47;
return res;
}
default:
var _v48 = _v17.a;
return 0;
}
default:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
break _v17$41;
case 14:
break _v17$44;
case 19:
break _v17$47;
case 18:
break _v17$50;
case 15:
break _v17$53;
case 16:
break _v17$56;
case 17:
break _v17$59;
case 20:
break _v17$62;
case 21:
break _v17$65;
case 22:
var _v49 = _v17.b;
return 2;
default:
var lc = _v17.a.a;
var rc = _v17.b.a;
return A2($elm$core$Basics$compare, lc, rc);
}
}
}
return 2;
}
return 0;
}
var _v42 = _v17.b;
return 2;
}
var _v41 = _v17.a;
return 0;
}
return 2;
}
return 0;
}
return 2;
}
return 0;
}
return 2;
}
return 0;
}
return 2;
}
return 0;
}
return 2;
}
return 0;
}
return 2;
}
return 0;
}
return 2;
}
return 0;
}
return 2;
}
return 0;
}
return 2;
}
return 0;
}
return 2;
}
return 0;
}
return 2;
}
return 0;
}
return 2;
}
return 0;
}
return 2;
}
return 0;
}
return 2;
}
return 0;
}
var _v35 = _v17.b;
return 2;
}
var _v34 = _v17.a;
return 0;
}
var _v31 = _v17.b;
return 2;
}
var _v30 = _v17.a;
return 0;
}
var _v26 = _v17.b;
return 2;
}
var _v25 = _v17.a;
return 0;
}
return 2;
}
return 0;
}
return 2;
}
return 0;
}
var _v21 = _v17.b;
return 2;
}
var _v20 = _v17.a;
return 0;
}
});
// reformatted for readability
$author$project$ExpressionDict$compareExpression = F2(function (_v15, _v16) {
compareExpression:for (; ;) {
var _v17 = {a: _v15.b, b: _v16.b};
_v17$1:for (; ;) {
_v17$2:for (; ;) {
_v17$4:for (; ;) {
_v17$5:for (; ;) {
_v17$7:for (; ;) {
_v17$8:for (; ;) {
_v17$10:for (; ;) {
_v17$11:for (; ;) {
_v17$13:for (; ;) {
_v17$14:for (; ;) {
_v17$16:for (; ;) {
_v17$17:for (; ;) {
_v17$19:for (; ;) {
_v17$20:for (; ;) {
_v17$22:for (; ;) {
_v17$23:for (; ;) {
_v17$25:for (; ;) {
_v17$26:for (; ;) {
_v17$28:for (; ;) {
_v17$29:for (; ;) {
_v17$31:for (; ;) {
_v17$32:for (; ;) {
_v17$34:for (; ;) {
_v17$35:for (; ;) {
_v17$37:for (; ;) {
_v17$38:for (; ;) {
_v17$40:for (; ;) {
_v17$41:for (; ;) {
_v17$43:for (; ;) {
_v17$44:for (; ;) {
_v17$46:for (; ;) {
_v17$47:for (; ;) {
_v17$49:for (; ;) {
_v17$50:for (; ;) {
_v17$52:for (; ;) {
_v17$53:for (; ;) {
_v17$55:for (; ;) {
_v17$56:for (; ;) {
_v17$58:for (; ;) {
_v17$59:for (; ;) {
_v17$61:for (; ;) {
_v17$62:for (; ;) {
_v17$64:for (; ;) {
_v17$65:for (; ;) switch (_v17.a.$) {
case 0:
if (0 !== _v17.b.$) break _v17$1;
return 1;
case 13:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
return A3($author$project$ExpressionDict$compareList, $author$project$ExpressionDict$compareExpression, lc = _v17.a.a, rc = _v17.b.a);
default:
break _v17$4
}
case 1:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
return A3($author$project$ExpressionDict$compareList, $author$project$ExpressionDict$compareExpression, lc = _v17.a.a, rc = _v17.b.a);
default:
break _v17$7
}
case 2:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
var _v22 = _v17.a,
lo = _v22.a,
ll = _v22.c,
_v22 = _v22.d,
_v23 = _v17.b,
ro = _v23.a,
rl = _v23.c,
_v23 = _v23.d,
_v24 = A2($elm$core$Basics$compare, lo, ro);
return 1 === _v24 ? A3($author$project$ExpressionDict$compareList, $author$project$ExpressionDict$compareExpression, _List_fromArray([ll, _v22]), _List_fromArray([rl, _v23])) : _v24;
default:
break _v17$10
}
case 3:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
var _v27 = _v17.a,
lname = _v27.b,
_v28 = _v17.b,
rname = _v28.b,
_v27 = A2($elm$core$Basics$compare, _v27.a, _v28.a);
return 1 === _v27 ? A2($elm$core$Basics$compare, lname, rname) : _v27;
default:
break _v17$13
}
case 4:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
var _v32 = _v17.a,
lc = _v32.a,
lf = _v32.c,
_v33 = _v17.b,
rc = _v33.a,
rt = _v33.b,
rf = _v33.c;
return A3($author$project$ExpressionDict$compareList, $author$project$ExpressionDict$compareExpression, _List_fromArray([lc, _v32.b, lf]), _List_fromArray([rc, rt, rf]));
default:
break _v17$16
}
case 5:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
return A2($elm$core$Basics$compare, lo = _v17.a.a, ro = _v17.b.a);
default:
break _v17$19
}
case 6:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
return A2($elm$core$Basics$compare, lo = _v17.a.a, ro = _v17.b.a);
default:
break _v17$22
}
case 7:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
return A2($elm$core$Basics$compare, _v17.a.a, _v17.b.a);
default:
break _v17$25
}
case 8:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
return A2($elm$core$Basics$compare, _v17.a.a, _v17.b.a);
default:
break _v17$28
}
case 9:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
return A2($elm$core$Basics$compare, lf = _v17.a.a, rf = _v17.b.a);
default:
break _v17$31
}
case 10:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
_v15 = lc = _v17.a.a, _v16 = rc = _v17.b.a;
continue compareExpression;
default:
break _v17$34
}
case 11:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
return A2($elm$core$Basics$compare, ll = _v17.a.a, rl = _v17.b.a);
default:
break _v17$37
}
case 12:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
return A2($elm$core$Basics$compare, ll = _v17.a.a, rl = _v17.b.a);
default:
break _v17$40
}
case 14:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
break _v17$41;
case 14:
_v15 = lc = _v17.a.a, _v16 = rc = _v17.b.a;
continue compareExpression;
default:
break _v17$43
}
case 19:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
break _v17$41;
case 14:
break _v17$44;
case 19:
return A3($author$project$ExpressionDict$compareList, $author$project$ExpressionDict$compareExpression, lc = _v17.a.a, rc = _v17.b.a);
default:
break _v17$46
}
case 18:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
break _v17$41;
case 14:
break _v17$44;
case 19:
break _v17$47;
case 18:
return A3($author$project$ExpressionDict$compareList, $author$project$ExpressionDict$compareRecordSetter, lc = _v17.a.a, rc = _v17.b.a);
default:
break _v17$49
}
case 15:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
break _v17$41;
case 14:
break _v17$44;
case 19:
break _v17$47;
case 18:
break _v17$50;
case 15:
return A2($author$project$ExpressionDict$compareLetBlocks, lc = _v17.a.a, rc = _v17.b.a);
default:
break _v17$52
}
case 16:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
break _v17$41;
case 14:
break _v17$44;
case 19:
break _v17$47;
case 18:
break _v17$50;
case 15:
break _v17$53;
case 16:
return A2($author$project$ExpressionDict$compareCaseBlocks, lc = _v17.a.a, rc = _v17.b.a);
default:
break _v17$55
}
case 17:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
break _v17$41;
case 14:
break _v17$44;
case 19:
break _v17$47;
case 18:
break _v17$50;
case 15:
break _v17$53;
case 16:
break _v17$56;
case 17:
return A2($author$project$ExpressionDict$compareLambda, lc = _v17.a.a, rc = _v17.b.a);
default:
break _v17$58
}
case 20:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
break _v17$41;
case 14:
break _v17$44;
case 19:
break _v17$47;
case 18:
break _v17$50;
case 15:
break _v17$53;
case 16:
break _v17$56;
case 17:
break _v17$59;
case 20:
var _v36 = _v17.a,
ln = _v36.a,
lf = _v36.b.b,
_v36 = _v17.b,
rn = _v36.a,
rf = _v36.b.b,
_v36 = A2($author$project$ExpressionDict$compareExpression, ln, rn);
return 1 === _v36 ? A2($elm$core$Basics$compare, lf, rf) : _v36;
default:
break _v17$61
}
case 21:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
break _v17$41;
case 14:
break _v17$44;
case 19:
break _v17$47;
case 18:
break _v17$50;
case 15:
break _v17$53;
case 16:
break _v17$56;
case 17:
break _v17$59;
case 20:
break _v17$62;
case 21:
return A2($elm$core$Basics$compare, lf = _v17.a.a, rf = _v17.b.a);
default:
break _v17$64
}
case 22:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
break _v17$41;
case 14:
break _v17$44;
case 19:
break _v17$47;
case 18:
break _v17$50;
case 15:
break _v17$53;
case 16:
break _v17$56;
case 17:
break _v17$59;
case 20:
break _v17$62;
case 21:
break _v17$65;
case 22:
var _v43 = _v17.a,
ln = _v43.a.b,
lc = _v43.b,
_v43 = _v17.b,
rn = _v43.a.b,
rc = _v43.b,
_v43 = A2($elm$core$Basics$compare, ln, rn);
return 1 === _v43 ? A3($author$project$ExpressionDict$compareList, $author$project$ExpressionDict$compareRecordSetter, lc, rc) : _v43;
default:
return 0
}
default:
switch (_v17.b.$) {
case 0:
break _v17$2;
case 13:
break _v17$5;
case 1:
break _v17$8;
case 2:
break _v17$11;
case 3:
break _v17$14;
case 4:
break _v17$17;
case 5:
break _v17$20;
case 6:
break _v17$23;
case 7:
break _v17$26;
case 8:
break _v17$29;
case 9:
break _v17$32;
case 10:
break _v17$35;
case 11:
break _v17$38;
case 12:
break _v17$41;
case 14:
break _v17$44;
case 19:
break _v17$47;
case 18:
break _v17$50;
case 15:
break _v17$53;
case 16:
break _v17$56;
case 17:
break _v17$59;
case 20:
break _v17$62;
case 21:
break _v17$65;
case 22:
return 2;
default:
return A2($elm$core$Basics$compare, lc = _v17.a.a, rc = _v17.b.a)
}
}
return 2
}
return 0
}
return 2
}
return 0
}
return 2
}
return 0
}
return 2
}
return 0
}
return 2
}
return 0
}
return 2
}
return 0
}
return 2
}
return 0
}
return 2
}
return 0
}
return 2
}
return 0
}
return 2
}
return 0
}
return 2
}
return 0
}
return 2
}
return 0
}
return 2
}
return 0
}
return 2
}
return 0
}
return 2
}
return 0
}
return 2
}
return 0
}
return 2
}
return 0
}
return 2
}
return 0
}
return 2
}
return 0
}
return 2
}
return 0
}
return 2
}
return 0
}
return 2
}
return 0
}
})
module ExpressionDict exposing (ExpressionDict, comparer, empty, get, insert)
import AVL.Dict
import Elm.Syntax.Expression as Expression exposing (Expression(..), LetDeclaration(..))
import Elm.Syntax.Node as Node exposing (Node(..))
import Elm.Syntax.Pattern as Pattern exposing (Pattern(..))
import Elm.Syntax.Signature exposing (Signature)
import Elm.Syntax.TypeAnnotation as TypeAnnotation exposing (TypeAnnotation)
type ExpressionDict a
= ExpressionDict (AVL.Dict.Dict Expression a)
empty : ExpressionDict a
empty =
ExpressionDict (AVL.Dict.emptyWith comparer)
insert : Expression -> a -> ExpressionDict a -> ExpressionDict a
insert k v (ExpressionDict dict) =
ExpressionDict (AVL.Dict.insert k v dict)
get : Expression -> ExpressionDict a -> Maybe a
get k (ExpressionDict dict) =
AVL.Dict.get k dict
comparer : Expression -> Expression -> Order
comparer l r =
compareExpression (Node.empty l) (Node.empty r)
compareExpression : Node Expression -> Node Expression -> Order
compareExpression (Node _ l) (Node _ r) =
case ( l, r ) of
( UnitExpr, UnitExpr ) ->
EQ
( UnitExpr, _ ) ->
LT
( _, UnitExpr ) ->
GT
( TupledExpression lc, TupledExpression rc ) ->
compareList compareExpression lc rc
( TupledExpression _, _ ) ->
LT
( _, TupledExpression _ ) ->
GT
( Application lc, Application rc ) ->
compareList compareExpression lc rc
( Application _, _ ) ->
LT
( _, Application _ ) ->
GT
( OperatorApplication lo _ ll lr, OperatorApplication ro _ rl rr ) ->
case compare lo ro of
EQ ->
compareList compareExpression [ ll, lr ] [ rl, rr ]
res ->
res
( OperatorApplication _ _ _ _, _ ) ->
LT
( _, OperatorApplication _ _ _ _ ) ->
GT
( FunctionOrValue lmod lname, FunctionOrValue rmod rname ) ->
case compare lmod rmod of
EQ ->
compare lname rname
res ->
res
( FunctionOrValue _ _, _ ) ->
LT
( _, FunctionOrValue _ _ ) ->
GT
( IfBlock lc lt lf, IfBlock rc rt rf ) ->
compareList compareExpression [ lc, lt, lf ] [ rc, rt, rf ]
( IfBlock _ _ _, _ ) ->
LT
( _, IfBlock _ _ _ ) ->
GT
( PrefixOperator lo, PrefixOperator ro ) ->
compare lo ro
( PrefixOperator _, _ ) ->
LT
( _, PrefixOperator _ ) ->
GT
( Operator lo, Operator ro ) ->
compare lo ro
( Operator _, _ ) ->
LT
( _, Operator _ ) ->
GT
( Integer li, Integer ri ) ->
compare li ri
( Integer _, _ ) ->
LT
( _, Integer _ ) ->
GT
( Hex lh, Hex rh ) ->
compare lh rh
( Hex _, _ ) ->
LT
( _, Hex _ ) ->
GT
( Floatable lf, Floatable rf ) ->
compare lf rf
( Floatable _, _ ) ->
LT
( _, Floatable _ ) ->
GT
( Negation lc, Negation rc ) ->
compareExpression lc rc
( Negation _, _ ) ->
LT
( _, Negation _ ) ->
GT
( Literal ll, Literal rl ) ->
compare ll rl
( Literal _, _ ) ->
LT
( _, Literal _ ) ->
GT
( CharLiteral ll, CharLiteral rl ) ->
compare ll rl
( CharLiteral _, _ ) ->
LT
( _, CharLiteral _ ) ->
GT
( ParenthesizedExpression lc, ParenthesizedExpression rc ) ->
compareExpression lc rc
( ParenthesizedExpression _, _ ) ->
LT
( _, ParenthesizedExpression _ ) ->
GT
( ListExpr lc, ListExpr rc ) ->
compareList compareExpression lc rc
( ListExpr _, _ ) ->
LT
( _, ListExpr _ ) ->
GT
( RecordExpr lc, RecordExpr rc ) ->
compareList compareRecordSetter lc rc
( RecordExpr _, _ ) ->
LT
( _, RecordExpr _ ) ->
GT
( LetExpression lc, LetExpression rc ) ->
compareLetBlocks lc rc
( LetExpression _, _ ) ->
LT
( _, LetExpression _ ) ->
GT
( CaseExpression lc, CaseExpression rc ) ->
compareCaseBlocks lc rc
( CaseExpression _, _ ) ->
LT
( _, CaseExpression _ ) ->
GT
( LambdaExpression lc, LambdaExpression rc ) ->
compareLambda lc rc
( LambdaExpression _, _ ) ->
LT
( _, LambdaExpression _ ) ->
GT
( RecordAccess ln (Node _ lf), RecordAccess rn (Node _ rf) ) ->
case compareExpression ln rn of
EQ ->
compare lf rf
res ->
res
( RecordAccess _ _, _ ) ->
LT
( _, RecordAccess _ _ ) ->
GT
( RecordAccessFunction lf, RecordAccessFunction rf ) ->
compare lf rf
( RecordAccessFunction _, _ ) ->
LT
( _, RecordAccessFunction _ ) ->
GT
( RecordUpdateExpression (Node _ ln) lc, RecordUpdateExpression (Node _ rn) rc ) ->
case compare ln rn of
EQ ->
compareList compareRecordSetter lc rc
res ->
res
( RecordUpdateExpression _ _, _ ) ->
LT
( _, RecordUpdateExpression _ _ ) ->
GT
( GLSLExpression lc, GLSLExpression rc ) ->
compare lc rc
compareLambda : Expression.Lambda -> Expression.Lambda -> Order
compareLambda l r =
case compareList comparePattern l.args r.args of
EQ ->
compareExpression l.expression r.expression
res ->
res
comparePattern : Node Pattern -> Node Pattern -> Order
comparePattern (Node _ l) (Node _ r) =
case ( l, r ) of
( AllPattern, AllPattern ) ->
EQ
( AllPattern, _ ) ->
LT
( _, AllPattern ) ->
GT
( UnitPattern, UnitPattern ) ->
EQ
( UnitPattern, _ ) ->
LT
( _, UnitPattern ) ->
GT
( CharPattern lc, CharPattern rc ) ->
compare lc rc
( CharPattern _, _ ) ->
LT
( _, CharPattern _ ) ->
GT
( StringPattern ls, StringPattern rs ) ->
compare ls rs
( StringPattern _, _ ) ->
LT
( _, StringPattern _ ) ->
GT
( IntPattern li, IntPattern ri ) ->
compare li ri
( IntPattern _, _ ) ->
LT
( _, IntPattern _ ) ->
GT
( HexPattern li, HexPattern ri ) ->
compare li ri
( HexPattern _, _ ) ->
LT
( _, HexPattern _ ) ->
GT
( FloatPattern lf, FloatPattern rf ) ->
compare lf rf
( FloatPattern _, _ ) ->
LT
( _, FloatPattern _ ) ->
GT
( TuplePattern lc, TuplePattern rc ) ->
compareList comparePattern lc rc
( TuplePattern _, _ ) ->
LT
( _, TuplePattern _ ) ->
GT
( RecordPattern lr, RecordPattern rr ) ->
compareList compareNode lr rr
( RecordPattern _, _ ) ->
LT
( _, RecordPattern _ ) ->
GT
( UnConsPattern lh lt, UnConsPattern rh rt ) ->
case comparePattern lh rh of
EQ ->
comparePattern lt rt
res ->
res
( UnConsPattern _ _, _ ) ->
LT
( _, UnConsPattern _ _ ) ->
GT
( ListPattern lp, ListPattern rp ) ->
compareList comparePattern lp rp
( ListPattern _, _ ) ->
LT
( _, ListPattern _ ) ->
GT
( VarPattern lv, VarPattern rv ) ->
compare lv rv
( VarPattern _, _ ) ->
LT
( _, VarPattern _ ) ->
GT
( NamedPattern lr lp, NamedPattern rr rp ) ->
case compareQualifiedNameRef lr rr of
EQ ->
compareList comparePattern lp rp
res ->
res
( NamedPattern _ _, _ ) ->
LT
( _, NamedPattern _ _ ) ->
GT
( AsPattern lp (Node _ ln), AsPattern rp (Node _ rn) ) ->
case comparePattern lp rp of
EQ ->
compare ln rn
res ->
res
( AsPattern _ _, _ ) ->
LT
( _, AsPattern _ _ ) ->
GT
( ParenthesizedPattern lc, ParenthesizedPattern rc ) ->
comparePattern lc rc
compareQualifiedNameRef : Pattern.QualifiedNameRef -> Pattern.QualifiedNameRef -> Order
compareQualifiedNameRef lq rq =
case compare lq.moduleName rq.moduleName of
EQ ->
compare lq.name rq.name
res ->
res
compareCaseBlocks : Expression.CaseBlock -> Expression.CaseBlock -> Order
compareCaseBlocks l r =
case compareExpression l.expression r.expression of
EQ ->
compareList compareCase l.cases r.cases
res ->
res
compareCase : Expression.Case -> Expression.Case -> Order
compareCase ( lp, le ) ( rp, re ) =
case comparePattern lp rp of
EQ ->
compareExpression le re
res ->
res
compareLetBlocks : Expression.LetBlock -> Expression.LetBlock -> Order
compareLetBlocks l r =
case compareList compareDeclaration l.declarations r.declarations of
EQ ->
compareExpression l.expression r.expression
res ->
res
compareDeclaration : Node LetDeclaration -> Node LetDeclaration -> Order
compareDeclaration (Node _ l) (Node _ r) =
case ( l, r ) of
( LetFunction lf, LetFunction rf ) ->
compareFunction lf rf
( LetFunction _, _ ) ->
LT
( _, LetFunction _ ) ->
GT
( LetDestructuring lp le, LetDestructuring rp re ) ->
case comparePattern lp rp of
EQ ->
compareExpression le re
res ->
res
compareFunction : Expression.Function -> Expression.Function -> Order
compareFunction l r =
case compareMaybe compareNode l.documentation r.documentation of
EQ ->
case compareMaybe compareSignature l.signature r.signature of
EQ ->
compareFunctionImplementation l.declaration r.declaration
res ->
res
res ->
res
compareMaybe : (a -> a -> Order) -> Maybe a -> Maybe a -> Order
compareMaybe f l r =
case ( l, r ) of
( Just lv, Just rv ) ->
f lv rv
( Just _, _ ) ->
LT
( _, Just _ ) ->
GT
( Nothing, Nothing ) ->
EQ
compareNode : Node comparable -> Node comparable -> Order
compareNode (Node _ l) (Node _ r) =
compare l r
compareSignature : Node Signature -> Node Signature -> Order
compareSignature (Node _ l) (Node _ r) =
case compareNode l.name r.name of
EQ ->
compareTypeAnnotation l.typeAnnotation r.typeAnnotation
res ->
res
compareTypeAnnotation : Node TypeAnnotation -> Node TypeAnnotation -> Order
compareTypeAnnotation (Node _ l) (Node _ r) =
case ( l, r ) of
( TypeAnnotation.Unit, TypeAnnotation.Unit ) ->
EQ
( TypeAnnotation.Unit, _ ) ->
LT
( _, TypeAnnotation.Unit ) ->
GT
( TypeAnnotation.GenericType lg, TypeAnnotation.GenericType rg ) ->
compare lg rg
( TypeAnnotation.GenericType _, _ ) ->
LT
( _, TypeAnnotation.GenericType _ ) ->
GT
( TypeAnnotation.Typed (Node _ lm) lp, TypeAnnotation.Typed (Node _ rm) rp ) ->
case compare lm rm of
EQ ->
compareList compareTypeAnnotation lp rp
res ->
res
( TypeAnnotation.Typed _ _, _ ) ->
LT
( _, TypeAnnotation.Typed _ _ ) ->
GT
( TypeAnnotation.Tupled lc, TypeAnnotation.Tupled rc ) ->
compareList compareTypeAnnotation lc rc
( TypeAnnotation.Tupled _, _ ) ->
LT
( _, TypeAnnotation.Tupled _ ) ->
GT
( TypeAnnotation.Record lr, TypeAnnotation.Record rr ) ->
compareList compareRecordFieldAnnotation lr rr
( TypeAnnotation.Record _, _ ) ->
LT
( _, TypeAnnotation.Record _ ) ->
GT
( TypeAnnotation.GenericRecord (Node _ ln) (Node _ lr), TypeAnnotation.GenericRecord (Node _ rn) (Node _ rr) ) ->
case compare ln rn of
EQ ->
compareList compareRecordFieldAnnotation lr rr
res ->
res
( TypeAnnotation.GenericRecord _ _, _ ) ->
LT
( _, TypeAnnotation.GenericRecord _ _ ) ->
GT
( TypeAnnotation.FunctionTypeAnnotation lf lt, TypeAnnotation.FunctionTypeAnnotation rf rt ) ->
case compareTypeAnnotation lf rf of
EQ ->
compareTypeAnnotation lt rt
res ->
res
compareRecordFieldAnnotation : Node TypeAnnotation.RecordField -> Node TypeAnnotation.RecordField -> Order
compareRecordFieldAnnotation (Node _ ( Node _ ln, lt )) (Node _ ( Node _ rn, rt )) =
case compare ln rn of
EQ ->
compareTypeAnnotation lt rt
res ->
res
compareFunctionImplementation : Node Expression.FunctionImplementation -> Node Expression.FunctionImplementation -> Order
compareFunctionImplementation (Node _ l) (Node _ r) =
case compareNode l.name r.name of
EQ ->
case compareList comparePattern l.arguments r.arguments of
EQ ->
compareExpression l.expression r.expression
res ->
res
res ->
res
compareRecordSetter : Node Expression.RecordSetter -> Node Expression.RecordSetter -> Order
compareRecordSetter (Node _ ( Node _ ln, le )) (Node _ ( Node _ rn, re )) =
case compare ln rn of
EQ ->
compareExpression le re
res ->
res
compareList : (a -> a -> Order) -> List a -> List a -> Order
compareList f l r =
case ( l, r ) of
( [], [] ) ->
EQ
( [], _ ) ->
LT
( _, [] ) ->
GT
( lh :: lt, rh :: rt ) ->
case f lh rh of
EQ ->
compareList f lt rt
res ->
res
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment