@@ -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);