on master help sign in
Simplify the JS API for sending values to signal ports, making error handling more reasonable
commit996848ce86667253d03b1e7f3ecc8a4154f5bc36 authorEvan Czaplicki <info@elm-lang.org> dateThu 16 Jan 2014, 18:30 (13 years ago) parent1a1aff1
2 files changed+26−38
libraries/Native/Ports.js+26−15 runtime/Init.js−23
libraries/Native/Ports.js+26−15
@@ -7,18 +7,8 @@ Elm.Native.Ports.make = function(elm) {
77 var Signal = Elm.Signal.make(elm);
88
99 function incomingSignal(converter) {
10− return function(port) {
11− var base = converter(port.internal.defaultValue);
12− var signal = Signal.constant(base);
13− port.internal.subscribe(function(v) {
14− try {
15− elm.notify(signal.id, converter(v));
16− } catch(e) {
17− port.internal.errorHandler(v);
18− }
19− });
20− return signal;
21− }
10+ converter.isSignal = true;
11+ return converter;
2212 }
2313
2414 function outgoingSignal(converter) {
@@ -42,18 +32,39 @@ Elm.Native.Ports.make = function(elm) {
4232 }
4333
4434 function portIn(name, converter) {
45− var value = elm.ports.incoming[name];
46− if (!value) {
35+ var jsValue = elm.ports.incoming[name];
36+ if (jsValue === undefined) {
4737 throw new Error("Initialization Error: port '" + name +
4838 "' was not given an input!");
4939 }
5040 elm.ports.uses[name] += 1;
5141 try {
52− return converter(value);
42+ var elmValue = converter(jsValue);
5343 } catch(e) {
5444 throw new Error("Initialization Error on port '" + name + "': \n" + e.message);
5545 }
46+
47+ // just return a static value if it is not a signal
48+ if (!converter.isSignal) {
49+ return elmValue;
50+ }
51+
52+ // create a signal if necessary
53+ var signal = Signal.constant(elmValue);
54+ function send(jsValue) {
55+ try {
56+ var elmValue = converter(jsValue);
57+ } catch(e) {
58+ throw new Error("Error sending to port '" + name + "': \n" + e.message);
59+ }
60+ setTimeout(function() {
61+ elm.notify(signal.id, elmValue);
62+ }, 0);
63+ }
64+ elm.ports.outgoing[name] = { send:send };
65+ return signal;
5666 }
67+
5768 function portOut(name, converter, value) {
5869 try {
5970 elm.ports.outgoing[name] = converter(value);
runtime/Init.js−23
@@ -27,29 +27,6 @@ Elm.worker = function(module, ports) {
2727 return init(ElmRuntime.Display.NONE, {}, module, ports || {});
2828};
2929
30−Elm.signal = function(defaultValue, errorHandler) {
31− var subscribers = []
32− function subscribe(handler) {
33− subscribers.push(handler);
34− }
35− function unsubscribe(handler) {
36− subscribers.pop(subscribers.indexOf(handler));
37− }
38− function send(value) {
39− var len = subscribers.length;
40− for (var i = 0; i < len; ++i) {
41− subscribers[i](value);
42− }
43− }
44− return {
45− send:send,
46− internal: { defaultValue:defaultValue,
47− errorHandler:errorHandler,
48− subscribe: subscribe,
49− unsubscribe: unsubscribe }
50− };
51−}
52−
5330function init(display, container, module, ports, moduleToReplace) {
5431 // defining state needed for an instance of the Elm RTS
5532 var inputs = [];