Change the format of module instantiation

Currently, it's only possible to create modules at the leafs of the
namespace structure. This CL lifts that restriction.

Get rid of "use strict" in many cases.
This commit is contained in:
Evan Czaplicki 2013-09-30 00:44:31 -07:00
parent d6c8ecd454
commit dcbe2fc245
28 changed files with 139 additions and 162 deletions

View file

@ -48,7 +48,7 @@ varDecl x expr =
VarDecl () (var x) (Just expr) VarDecl () (var x) (Just expr)
include alias moduleName = include alias moduleName =
varDecl alias (obj moduleName <| ref "elm") varDecl alias (obj (moduleName ++ ".make") <| ref "elm")
internalImports name = internalImports name =
VarDeclStmt () VarDeclStmt ()
@ -278,8 +278,9 @@ clause span variable (Clause value vars mtch) =
jsModule :: MetadataModule () () -> String jsModule :: MetadataModule () () -> String
jsModule modul = show . prettyPrint $ setup (Just "Elm") (names modul) ++ jsModule modul =
[ assign ("Elm" : names modul) (function ["elm"] programStmts) ] show . prettyPrint $ setup (Just "Elm") (names modul ++ ["make"]) ++
[ assign ("Elm" : names modul ++ ["make"]) (function ["elm"] programStmts) ]
where where
thisModule = dotSep ("elm" : names modul) thisModule = dotSep ("elm" : names modul)
programStmts = programStmts =
@ -306,9 +307,10 @@ jsModule modul = show . prettyPrint $ setup (Just "Elm") (names modul) ++
_ -> ExprStmt () $ _ -> ExprStmt () $
AssignExpr () OpAssign (LDot () (dotSep (init path)) (last path)) expr AssignExpr () OpAssign (LDot () (dotSep (init path)) (last path)) expr
jsImport (modul,_) = setup Nothing path ++ [ assign path (dotSep ("Elm" : path) <| ref "elm") ] jsImport (modul,_) = setup Nothing path ++ [ include ]
where where
path = split modul path = split modul
include = assign path $ dotSep ("Elm" : path ++ ["make"]) <| ref "elm"
setup namespace path = map create paths setup namespace path = map create paths
where where

View file

@ -1,11 +1,11 @@
Elm.Native.Basics = function(elm) { Elm.Native.Basics = {};
'use strict'; Elm.Native.Basics.make = function(elm) {
if (elm.Native.Basics) return elm.Native.Basics; if (elm.Native.Basics) return elm.Native.Basics;
var JS = Elm.Native.JavaScript(elm); var JS = Elm.Native.JavaScript.make(elm);
// var Maybe = Elm.Maybe(elm); // var Maybe = Elm.Maybe(elm);
var Utils = Elm.Native.Utils(elm); var Utils = Elm.Native.Utils.make(elm);
//var Char = Elm.Char(elm); //var Char = Elm.Char(elm);
function div(a,b) { return (a/b)|0; } function div(a,b) { return (a/b)|0; }

View file

@ -1,31 +1,28 @@
Elm.Native.Char = {};
Elm.Native.Char.make = function(elm) {
elm.Native = elm.Native || {};
if (elm.Native.Char) return elm.Native.Char;
Elm.Native.Char = function(elm) { function isBetween(lo,hi) { return function(chr) {
'use strict'; var c = chr.charCodeAt(0);
return lo <= c && c <= hi;
elm.Native = elm.Native || {}; };
if (elm.Native.Char) return elm.Native.Char; }
var isDigit = isBetween('0'.charCodeAt(0),'9'.charCodeAt(0));
function isBetween(lo,hi) { return function(chr) { var chk1 = isBetween('a'.charCodeAt(0),'f'.charCodeAt(0));
var c = chr.charCodeAt(0); var chk2 = isBetween('A'.charCodeAt(0),'F'.charCodeAt(0));
return lo <= c && c <= hi;
};
}
var isDigit = isBetween('0'.charCodeAt(0),'9'.charCodeAt(0));
var chk1 = isBetween('a'.charCodeAt(0),'f'.charCodeAt(0));
var chk2 = isBetween('A'.charCodeAt(0),'F'.charCodeAt(0));
return elm.Native.Char = {
fromCode : function(c) { return String.fromCharCode(c); },
toCode : function(c) { return c.toUpperCase().charCodeAt(0); },
toUpper : function(c) { return c.toUpperCase(); },
toLower : function(c) { return c.toLowerCase(); },
toLocaleUpper : function(c) { return c.toLocaleUpperCase(); },
toLocaleLower : function(c) { return c.toLocaleLowerCase(); },
isLower : isBetween('a'.charCodeAt(0),'z'.charCodeAt(0)),
isUpper : isBetween('A'.charCodeAt(0),'Z'.charCodeAt(0)),
isDigit : isDigit,
isOctDigit : isBetween('0'.charCodeAt(0),'7'.charCodeAt(0)),
isHexDigit : function(c) { return isDigit(c) || chk1(c) || chk2(c); }
};
return elm.Native.Char = {
fromCode : function(c) { return String.fromCharCode(c); },
toCode : function(c) { return c.toUpperCase().charCodeAt(0); },
toUpper : function(c) { return c.toUpperCase(); },
toLower : function(c) { return c.toLowerCase(); },
toLocaleUpper : function(c) { return c.toLocaleUpperCase(); },
toLocaleLower : function(c) { return c.toLocaleLowerCase(); },
isLower : isBetween('a'.charCodeAt(0),'z'.charCodeAt(0)),
isUpper : isBetween('A'.charCodeAt(0),'Z'.charCodeAt(0)),
isDigit : isDigit,
isOctDigit : isBetween('0'.charCodeAt(0),'7'.charCodeAt(0)),
isHexDigit : function(c) { return isDigit(c) || chk1(c) || chk2(c); }
};
}; };

View file

@ -1,12 +1,9 @@
Elm.Native.Color = {};
Elm.Native.Color.make = function(elm) {
Elm.Native.Color = function(elm) {
"use strict";
elm.Native = elm.Native || {}; elm.Native = elm.Native || {};
if (elm.Native.Color) return elm.Native.Color; if (elm.Native.Color) return elm.Native.Color;
var Utils = Elm.Native.Utils(elm); var Utils = Elm.Native.Utils.make(elm);
function complement(rgb) { function complement(rgb) {
var hsv = toHSV(rgb); var hsv = toHSV(rgb);

View file

@ -1,12 +1,10 @@
Elm.Native.Date = {};
Elm.Native.Date = function(elm) { Elm.Native.Date.make = function(elm) {
'use strict';
elm.Native = elm.Native || {}; elm.Native = elm.Native || {};
if (elm.Native.Date) return elm.Native.Date; if (elm.Native.Date) return elm.Native.Date;
var JS = Elm.JavaScript(elm); var JS = Elm.JavaScript.make(elm);
var Maybe = Elm.Maybe(elm); var Maybe = Elm.Maybe.make(elm);
function dateNow() { return new window.Date; } function dateNow() { return new window.Date; }
function readDate(str) { function readDate(str) {

View file

@ -1,10 +1,9 @@
Elm.Native.Error = {};
Elm.Native.Error = function(elm) { Elm.Native.Error.make = function(elm) {
'use strict';
elm.Native = elm.Native || {}; elm.Native = elm.Native || {};
if (elm.Native.Error) return elm.Native.Error; if (elm.Native.Error) return elm.Native.Error;
var fromString = Elm.Native.JavaScript(elm).fromString; var fromString = Elm.Native.JavaScript.make(elm).fromString;
function indent(lines) { function indent(lines) {
var msg = ''; var msg = '';

View file

@ -1,12 +1,11 @@
Elm.Native.Graphics.Collage = {};
Elm.Native.Graphics.Collage = function(elm) { Elm.Native.Graphics.Collage.make = function(elm) {
"use strict";
elm.Native = elm.Native || {}; elm.Native = elm.Native || {};
elm.Native.Graphics = elm.Native.Graphics || {}; elm.Native.Graphics = elm.Native.Graphics || {};
if (elm.Native.Graphics.Collage) return elm.Native.Graphics.Collage; if (elm.Native.Graphics.Collage) return elm.Native.Graphics.Collage;
var newElement = Elm.Graphics.Element(elm).newElement; var newElement = Elm.Graphics.Element.make(elm).newElement;
var C = ElmRuntime.use(ElmRuntime.Render.Collage); var C = ElmRuntime.use(ElmRuntime.Render.Collage);
function collage(w,h,forms) { function collage(w,h,forms) {

View file

@ -1,6 +1,5 @@
Elm.Native.Graphics.Input = {};
Elm.Native.Graphics.Input = function(elm) { Elm.Native.Graphics.Input.make = function(elm) {
"use strict";
elm.Native = elm.Native || {}; elm.Native = elm.Native || {};
elm.Native.Graphics = elm.Native.Graphics || {}; elm.Native.Graphics = elm.Native.Graphics || {};
@ -9,10 +8,10 @@ Elm.Native.Graphics.Input = function(elm) {
var Render = ElmRuntime.use(ElmRuntime.Render.Element); var Render = ElmRuntime.use(ElmRuntime.Render.Element);
var newNode = ElmRuntime.use(ElmRuntime.Render.Utils).newElement; var newNode = ElmRuntime.use(ElmRuntime.Render.Utils).newElement;
var Signal = Elm.Signal(elm); var Signal = Elm.Signal.make(elm);
var newElement = Elm.Graphics.Element(elm).newElement; var newElement = Elm.Graphics.Element.make(elm).newElement;
var JS = Elm.Native.JavaScript(elm); var JS = Elm.Native.JavaScript.make(elm);
var Utils = Elm.Native.Utils(elm); var Utils = Elm.Native.Utils.make(elm);
var Tuple2 = Utils.Tuple2; var Tuple2 = Utils.Tuple2;
function dropDown(values) { function dropDown(values) {

View file

@ -1,11 +1,9 @@
Elm.Native.JavaScript = {};
Elm.Native.JavaScript = function(elm) { Elm.Native.JavaScript.make = function(elm) {
'use strict';
elm.Native = elm.Native || {}; elm.Native = elm.Native || {};
if (elm.Native.JavaScript) return elm.Native.JavaScript; if (elm.Native.JavaScript) return elm.Native.JavaScript;
var List = Elm.Native.List(elm); var List = Elm.Native.List.make(elm);
var Render = ElmRuntime.use(ElmRuntime.Render.Element); var Render = ElmRuntime.use(ElmRuntime.Render.Element);
function fromJS(v) { function fromJS(v) {

View file

@ -1,12 +1,11 @@
Elm.Native.Json = {};
Elm.Native.Json.make = function(elm) {
Elm.Native.Json = function(elm) { var Maybe = Elm.Maybe.make(elm);
'use strict'; var Dict = Elm.Dict.make(elm);
var List = Elm.List.make(elm);
var Maybe = Elm.Maybe(elm); var JS = Elm.JavaScript.make(elm);
var Dict = Elm.Dict(elm); var Utils = Elm.Native.Utils.make(elm);
var List = Elm.List(elm);
var JS = Elm.JavaScript(elm);
var Utils = Elm.Native.Utils(elm);
function fromValue(v) { function fromValue(v) {
switch (v.ctor) { switch (v.ctor) {

View file

@ -1,12 +1,11 @@
Elm.Native.List = function(elm) { Elm.Native.List = {};
"use strict"; Elm.Native.List.make = function(elm) {
elm.Native = elm.Native || {}; elm.Native = elm.Native || {};
if (elm.Native.List) return elm.Native.List; if (elm.Native.List) return elm.Native.List;
if ('values' in Elm.Native.List) if ('values' in Elm.Native.List)
return elm.Native.List = Elm.Native.List.values; return elm.Native.List = Elm.Native.List.values;
var Utils = Elm.Native.Utils(elm); var Utils = Elm.Native.Utils.make(elm);
// TODO: Improve Nil handling // TODO: Improve Nil handling
// We can change places like: if (xs.ctor === '[]') ... to if (xs === Nil) ... // We can change places like: if (xs.ctor === '[]') ... to if (xs === Nil) ...

View file

@ -1,11 +1,10 @@
Elm.Native.Prelude = {};
Elm.Native.Prelude = function(elm) { Elm.Native.Prelude.make = function(elm) {
'use strict';
if (elm.Native.Prelude) return elm.Native.Prelude; if (elm.Native.Prelude) return elm.Native.Prelude;
var JS = Elm.Native.JavaScript(elm); var JS = Elm.Native.JavaScript.make(elm);
var Maybe = Elm.Maybe(elm); var Maybe = Elm.Maybe.make(elm);
var Char = Elm.Char(elm); var Char = Elm.Char.make(elm);
function readInt(str) { function readInt(str) {
var s = JS.fromString(str); var s = JS.fromString(str);

View file

@ -1,17 +1,15 @@
Elm.Native.Show = {};
Elm.Native.Show = function(elm) { Elm.Native.Show.make = function(elm) {
'use strict';
elm.Native = elm.Native || {}; elm.Native = elm.Native || {};
if (elm.Native.Show) return elm.Native.Show; if (elm.Native.Show) return elm.Native.Show;
var NList = Elm.Native.List(elm); var NList = Elm.Native.List.make(elm);
var List = Elm.List(elm); var List = Elm.List.make(elm);
var Maybe = Elm.Maybe(elm); var Maybe = Elm.Maybe.make(elm);
var JS = Elm.JavaScript(elm); var JS = Elm.JavaScript.make(elm);
var Dict = Elm.Dict(elm); var Dict = Elm.Dict.make(elm);
var Json = Elm.Json(elm); var Json = Elm.Json.make(elm);
var Tuple2 = Elm.Native.Utils(elm).Tuple2; var Tuple2 = Elm.Native.Utils.make(elm).Tuple2;
var toString = function(v) { var toString = function(v) {
var type = typeof v; var type = typeof v;

View file

@ -1,13 +1,13 @@
Elm.Native.Http = {};
Elm.Native.Http.make = function(elm) {
Elm.Native.Http = function(elm) {
'use strict';
elm.Native = elm.Native || {}; elm.Native = elm.Native || {};
if (elm.Native.Http) return elm.Native.Http; if (elm.Native.Http) return elm.Native.Http;
var JS = Elm.JavaScript(elm); var JS = Elm.JavaScript.make(elm);
var List = Elm.List(elm); var List = Elm.List.make(elm);
var Signal = Elm.Signal(elm); var Signal = Elm.Signal.make(elm);
function registerReq(queue,responses) { return function(req) { function registerReq(queue,responses) { return function(req) {

View file

@ -1,6 +1,6 @@
Elm.Native.Keyboard = {};
Elm.Native.Keyboard.make = function(elm) {
Elm.Native.Keyboard = function(elm) {
'use strict';
elm.Native = elm.Native || {}; elm.Native = elm.Native || {};
if (elm.Native.Keyboard) return elm.Native.Keyboard; if (elm.Native.Keyboard) return elm.Native.Keyboard;
@ -12,9 +12,9 @@ Elm.Native.Keyboard = function(elm) {
} }
} }
var Signal = Elm.Signal(elm); var Signal = Elm.Signal.make(elm);
var NList = Elm.Native.List(elm); var NList = Elm.Native.List.make(elm);
var Utils = Elm.Native.Utils(elm); var Utils = Elm.Native.Utils.make(elm);
var downEvents = Signal.constant(0); var downEvents = Signal.constant(0);
var upEvents = Signal.constant(0); var upEvents = Signal.constant(0);

View file

@ -1,11 +1,11 @@
Elm.Native.Mouse = {};
Elm.Native.Mouse.make = function(elm) {
Elm.Native.Mouse = function(elm) {
'use strict';
elm.Native = elm.Native || {}; elm.Native = elm.Native || {};
if (elm.Native.Mouse) return elm.Native.Mouse; if (elm.Native.Mouse) return elm.Native.Mouse;
var Signal = Elm.Signal(elm); var Signal = Elm.Signal.make(elm);
var Utils = Elm.Native.Utils(elm); var Utils = Elm.Native.Utils.make(elm);
var position = Signal.constant(Utils.Tuple2(0,0)); var position = Signal.constant(Utils.Tuple2(0,0));
position.defaultNumberOfKids = 2; position.defaultNumberOfKids = 2;

View file

@ -1,10 +1,10 @@
Elm.Native.Random = {};
Elm.Native.Random.make = function(elm) {
Elm.Native.Random = function(elm) {
'use strict';
elm.Native = elm.Native || {}; elm.Native = elm.Native || {};
if (elm.Native.Random) return elm.Native.Random; if (elm.Native.Random) return elm.Native.Random;
var Signal = Elm.Signal(elm); var Signal = Elm.Signal.make(elm);
function range(min, max, signal) { function range(min, max, signal) {
function f(x) { return Math.floor(Math.random() * (max-min+1)) + min; } function f(x) { return Math.floor(Math.random() * (max-min+1)) + min; }

View file

@ -1,12 +1,12 @@
Elm.Native.Signal = function(elm) { Elm.Native.Signal = {};
'use strict'; Elm.Native.Signal.make = function(elm) {
elm.Native = elm.Native || {}; elm.Native = elm.Native || {};
if (elm.Native.Signal) return elm.Native.Signal; if (elm.Native.Signal) return elm.Native.Signal;
var Utils = Elm.Native.Utils(elm); var Utils = Elm.Native.Utils.make(elm);
var foldl1 = Elm.List(elm).foldl1; var foldl1 = Elm.List.make(elm).foldl1;
function send(node, timestep, changed) { function send(node, timestep, changed) {
var kids = node.kids; var kids = node.kids;

View file

@ -1,11 +1,10 @@
Elm.Native.Time = {};
Elm.Native.Time.make = function(elm) {
Elm.Native.Time = function(elm) { var Signal = Elm.Signal.make(elm);
'use strict'; var NS = Elm.Native.Signal.make(elm);
var Maybe = Elm.Maybe.make(elm);
var Signal = Elm.Signal(elm); var Utils = Elm.Native.Utils.make(elm);
var NS = Elm.Native.Signal(elm);
var Maybe = Elm.Maybe(elm);
var Utils = Elm.Native.Utils(elm);
function fpsWhen(desiredFPS, isOn) { function fpsWhen(desiredFPS, isOn) {
var msPerFrame = 1000 / desiredFPS; var msPerFrame = 1000 / desiredFPS;

View file

@ -1,13 +1,12 @@
Elm.Native.Touch = {};
Elm.Native.Touch = function(elm) { Elm.Native.Touch.make = function(elm) {
'use strict';
elm.Native = elm.Native || {}; elm.Native = elm.Native || {};
if (elm.Native.Touch) return elm.Native.Touch; if (elm.Native.Touch) return elm.Native.Touch;
var Signal = Elm.Signal(elm); var Signal = Elm.Signal.make(elm);
var JS = Elm.JavaScript(elm); var JS = Elm.JavaScript.make(elm);
var _ = Elm.Native.Utils(elm); var _ = Elm.Native.Utils.make(elm);
function Dict() { function Dict() {
this.keys = []; this.keys = [];

View file

@ -1,13 +1,12 @@
Elm.Native.WebSocket = {};
Elm.Native.WebSocket = function(elm) { Elm.Native.WebSocket.make = function(elm) {
'use strict';
elm.Native = elm.Native || {}; elm.Native = elm.Native || {};
if (elm.Native.WebSocket) return elm.Native.WebSocket; if (elm.Native.WebSocket) return elm.Native.WebSocket;
var Signal = Elm.Signal(elm); var Signal = Elm.Signal.make(elm);
var JS = Elm.JavaScript(elm); var JS = Elm.JavaScript.make(elm);
var List = Elm.Native.List(elm); var List = Elm.Native.List.make(elm);
function open(url, outgoing) { function open(url, outgoing) {
var incoming = Signal.constant(List.Nil); var incoming = Signal.constant(List.Nil);

View file

@ -1,12 +1,11 @@
Elm.Native.Window = {};
Elm.Native.Window = function(elm) { Elm.Native.Window.make = function(elm) {
'use strict';
elm.Native = elm.Native || {}; elm.Native = elm.Native || {};
if (elm.Native.Window) return elm.Native.Window; if (elm.Native.Window) return elm.Native.Window;
var Signal = Elm.Signal(elm); var Signal = Elm.Signal.make(elm);
var Tuple2 = Elm.Native.Utils(elm).Tuple2; var Tuple2 = Elm.Native.Utils.make(elm).Tuple2;
function getWidth() { return elm.node.clientWidth; } function getWidth() { return elm.node.clientWidth; }
function getHeight() { function getHeight() {

View file

@ -1,15 +1,13 @@
Elm.Native.Text = {};
Elm.Native.Text = function(elm) { Elm.Native.Text.make = function(elm) {
'use strict';
elm.Native = elm.Native || {}; elm.Native = elm.Native || {};
if (elm.Native.Text) return elm.Native.Text; if (elm.Native.Text) return elm.Native.Text;
var JS = Elm.JavaScript(elm); var JS = Elm.JavaScript.make(elm);
var htmlHeight = Elm.Native.Utils(elm).htmlHeight; var htmlHeight = Elm.Native.Utils.make(elm).htmlHeight;
var Color = Elm.Native.Color(elm); var Color = Elm.Native.Color.make(elm);
var Element = Elm.Graphics.Element(elm); var Element = Elm.Graphics.Element.make(elm);
var show = Elm.Native.Show(elm).show; var show = Elm.Native.Show.make(elm).show;
function makeSpaces(s) { function makeSpaces(s) {
if (s.length == 0) { return s; } if (s.length == 0) { return s; }

View file

@ -1,6 +1,6 @@
Elm.Native.Transform2D = function(elm) { Elm.Native.Transform2D = {};
"use strict"; Elm.Native.Transform2D.make = function(elm) {
elm.Native = elm.Native || {}; elm.Native = elm.Native || {};
if (elm.Native.Transform2D) return elm.Native.Transform2D; if (elm.Native.Transform2D) return elm.Native.Transform2D;

View file

@ -1,5 +1,6 @@
Elm.Native.Utils = function(elm) { Elm.Native.Utils = {};
Elm.Native.Utils.make = function(elm) {
'use strict'; 'use strict';
elm.Native = elm.Native || {}; elm.Native = elm.Native || {};

View file

@ -99,10 +99,10 @@ function init(display, container, module, moduleToReplace) {
var Module = {}; var Module = {};
var reportAnyErrors = function() {}; var reportAnyErrors = function() {};
try { try {
Module = module(elm); Module = module.make(elm);
} catch(e) { } catch(e) {
var directions = "<br/>&nbsp; &nbsp; Open the developer console for more details." var directions = "<br/>&nbsp; &nbsp; Open the developer console for more details."
Module.main = Elm.Text(elm).text('<code>' + e.message + directions + '</code>'); Module.main = Elm.Text.make(elm).text('<code>' + e.message + directions + '</code>');
reportAnyErrors = function() { throw e; } reportAnyErrors = function() { throw e; }
} }
inputs = ElmRuntime.filterDeadInputs(inputs); inputs = ElmRuntime.filterDeadInputs(inputs);
@ -150,7 +150,7 @@ function initGraphics(elm, Module) {
var signalGraph = Module.main; var signalGraph = Module.main;
// make sure the signal graph is actually a signal & extract the visual model // make sure the signal graph is actually a signal & extract the visual model
var Signal = Elm.Signal(elm); var Signal = Elm.Signal.make(elm);
if (!('recv' in signalGraph)) { if (!('recv' in signalGraph)) {
signalGraph = Signal.constant(signalGraph); signalGraph = Signal.constant(signalGraph);
} }

View file

@ -1,9 +1,8 @@
ElmRuntime.Render.Collage = function() { ElmRuntime.Render.Collage = function() {
'use strict';
var Render = ElmRuntime.use(ElmRuntime.Render.Element); var Render = ElmRuntime.use(ElmRuntime.Render.Element);
var Transform = Elm.Transform2D({}); var Transform = Elm.Transform2D.make({});
var Utils = ElmRuntime.use(ElmRuntime.Render.Utils); var Utils = ElmRuntime.use(ElmRuntime.Render.Utils);
var newElement = Utils.newElement, var newElement = Utils.newElement,
extract = Utils.extract, fromList = Utils.fromList, extract = Utils.extract, fromList = Utils.fromList,

View file

@ -1,6 +1,5 @@
ElmRuntime.Render.Utils = function() { ElmRuntime.Render.Utils = function() {
'use strict';
function newElement(elementType) { function newElement(elementType) {
var e = document.createElement(elementType); var e = document.createElement(elementType);
@ -34,7 +33,7 @@ function removeTransform(style) {
style.OTransform = 'none'; style.OTransform = 'none';
} }
var List = Elm.Native.List({}); var List = Elm.Native.List.make({});
return {addTo:addTo, return {addTo:addTo,
newElement:newElement, newElement:newElement,
@ -42,7 +41,7 @@ return {addTo:addTo,
fromList: List.toArray, fromList: List.toArray,
fromString: function(s) { return List.toArray(s).join(''); }, fromString: function(s) { return List.toArray(s).join(''); },
toString: List.fromArray, toString: List.fromArray,
eq: Elm.Native.Utils({}).eq, eq: Elm.Native.Utils.make({}).eq,
addTransform: addTransform, addTransform: addTransform,
removeTransform: removeTransform removeTransform: removeTransform
}; };