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

View file

@ -1,11 +1,11 @@
Elm.Native.Basics = function(elm) {
'use strict';
Elm.Native.Basics = {};
Elm.Native.Basics.make = function(elm) {
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 Utils = Elm.Native.Utils(elm);
var Utils = Elm.Native.Utils.make(elm);
//var Char = Elm.Char(elm);
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) {
'use strict';
elm.Native = elm.Native || {};
if (elm.Native.Char) return elm.Native.Char;
function isBetween(lo,hi) { return function(chr) {
var c = chr.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); }
};
function isBetween(lo,hi) { return function(chr) {
var c = chr.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); }
};
};

View file

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

View file

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

View file

@ -1,10 +1,9 @@
Elm.Native.Error = function(elm) {
'use strict';
Elm.Native.Error = {};
Elm.Native.Error.make = function(elm) {
elm.Native = elm.Native || {};
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) {
var msg = '';

View file

@ -1,12 +1,11 @@
Elm.Native.Graphics.Collage = function(elm) {
"use strict";
Elm.Native.Graphics.Collage = {};
Elm.Native.Graphics.Collage.make = function(elm) {
elm.Native = elm.Native || {};
elm.Native.Graphics = elm.Native.Graphics || {};
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);
function collage(w,h,forms) {

View file

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

View file

@ -1,11 +1,9 @@
Elm.Native.JavaScript = function(elm) {
'use strict';
Elm.Native.JavaScript = {};
Elm.Native.JavaScript.make = function(elm) {
elm.Native = elm.Native || {};
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);
function fromJS(v) {

View file

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

View file

@ -1,12 +1,11 @@
Elm.Native.List = function(elm) {
"use strict";
Elm.Native.List = {};
Elm.Native.List.make = function(elm) {
elm.Native = elm.Native || {};
if (elm.Native.List) return elm.Native.List;
if ('values' in Elm.Native.List)
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
// We can change places like: if (xs.ctor === '[]') ... to if (xs === Nil) ...

View file

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

View file

@ -1,17 +1,15 @@
Elm.Native.Show = function(elm) {
'use strict';
Elm.Native.Show = {};
Elm.Native.Show.make = function(elm) {
elm.Native = elm.Native || {};
if (elm.Native.Show) return elm.Native.Show;
var NList = Elm.Native.List(elm);
var List = Elm.List(elm);
var Maybe = Elm.Maybe(elm);
var JS = Elm.JavaScript(elm);
var Dict = Elm.Dict(elm);
var Json = Elm.Json(elm);
var Tuple2 = Elm.Native.Utils(elm).Tuple2;
var NList = Elm.Native.List.make(elm);
var List = Elm.List.make(elm);
var Maybe = Elm.Maybe.make(elm);
var JS = Elm.JavaScript.make(elm);
var Dict = Elm.Dict.make(elm);
var Json = Elm.Json.make(elm);
var Tuple2 = Elm.Native.Utils.make(elm).Tuple2;
var toString = function(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 || {};
if (elm.Native.Http) return elm.Native.Http;
var JS = Elm.JavaScript(elm);
var List = Elm.List(elm);
var Signal = Elm.Signal(elm);
var JS = Elm.JavaScript.make(elm);
var List = Elm.List.make(elm);
var Signal = Elm.Signal.make(elm);
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 || {};
if (elm.Native.Keyboard) return elm.Native.Keyboard;
@ -12,9 +12,9 @@ Elm.Native.Keyboard = function(elm) {
}
}
var Signal = Elm.Signal(elm);
var NList = Elm.Native.List(elm);
var Utils = Elm.Native.Utils(elm);
var Signal = Elm.Signal.make(elm);
var NList = Elm.Native.List.make(elm);
var Utils = Elm.Native.Utils.make(elm);
var downEvents = 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 || {};
if (elm.Native.Mouse) return elm.Native.Mouse;
var Signal = Elm.Signal(elm);
var Utils = Elm.Native.Utils(elm);
var Signal = Elm.Signal.make(elm);
var Utils = Elm.Native.Utils.make(elm);
var position = Signal.constant(Utils.Tuple2(0,0));
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 || {};
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 f(x) { return Math.floor(Math.random() * (max-min+1)) + min; }

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,6 +1,6 @@
Elm.Native.Transform2D = function(elm) {
"use strict";
Elm.Native.Transform2D = {};
Elm.Native.Transform2D.make = function(elm) {
elm.Native = elm.Native || {};
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';
elm.Native = elm.Native || {};

View file

@ -99,10 +99,10 @@ function init(display, container, module, moduleToReplace) {
var Module = {};
var reportAnyErrors = function() {};
try {
Module = module(elm);
Module = module.make(elm);
} catch(e) {
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; }
}
inputs = ElmRuntime.filterDeadInputs(inputs);
@ -150,7 +150,7 @@ function initGraphics(elm, Module) {
var signalGraph = Module.main;
// 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)) {
signalGraph = Signal.constant(signalGraph);
}

View file

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

View file

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