@@ -7,18 +7,8 @@ Elm.Native.Ports.make = function(elm) {
7 var Signal = Elm.Signal.make(elm);
7 var Signal = Elm.Signal.make(elm);
9 function incomingSignal(converter) {
9 function incomingSignal(converter) {
10− return function(port) {
10+ converter.isSignal = true;
11− var base = converter(port.internal.defaultValue);
12− var signal = Signal.constant(base);
13− port.internal.subscribe(function(v) {
15− elm.notify(signal.id, converter(v));
11+ return converter;
17− port.internal.errorHandler(v);
24 function outgoingSignal(converter) {
14 function outgoingSignal(converter) {
@@ -42,18 +32,39 @@ Elm.Native.Ports.make = function(elm) {
44 function portIn(name, converter) {
34 function portIn(name, converter) {
45− var value = elm.ports.incoming[name];
35+ var jsValue = elm.ports.incoming[name];
46− if (!value) {
36+ if (jsValue === undefined) {
47 throw new Error("Initialization Error: port '" + name +
37 throw new Error("Initialization Error: port '" + name +
48 "' was not given an input!");
38 "' was not given an input!");
50 elm.ports.uses[name] += 1;
40 elm.ports.uses[name] += 1;
52− return converter(value);
42+ var elmValue = converter(jsValue);
53 } catch(e) {
43 } catch(e) {
54 throw new Error("Initialization Error on port '" + name + "': \n" + e.message);
44 throw new Error("Initialization Error on port '" + name + "': \n" + e.message);
47+ // just return a static value if it is not a signal
48+ if (!converter.isSignal) {
52+ // create a signal if necessary
53+ var signal = Signal.constant(elmValue);
54+ function send(jsValue) {
56+ var elmValue = converter(jsValue);
58+ throw new Error("Error sending to port '" + name + "': \n" + e.message);
60+ setTimeout(function() {
61+ elm.notify(signal.id, elmValue);
64+ elm.ports.outgoing[name] = { send:send };
57 function portOut(name, converter, value) {
68 function portOut(name, converter, value) {
59 elm.ports.outgoing[name] = converter(value);
70 elm.ports.outgoing[name] = converter(value);