2014-01-06 06:47:05 +00:00
|
|
|
Elm.Native.Ports = {};
|
|
|
|
Elm.Native.Ports.make = function(elm) {
|
|
|
|
elm.Native = elm.Native || {};
|
|
|
|
elm.Native.Ports = elm.Native.Ports || {};
|
|
|
|
if (elm.Native.Ports.values) return elm.Native.Ports.values;
|
|
|
|
|
|
|
|
var Signal = Elm.Signal.make(elm);
|
|
|
|
|
2014-01-13 18:32:54 +00:00
|
|
|
function incomingSignal(converter) {
|
|
|
|
return function(port) {
|
|
|
|
var base = converter(port.internal.defaultValue);
|
|
|
|
var signal = Signal.constant(base);
|
|
|
|
port.internal.subscribe(function(v) {
|
|
|
|
try {
|
|
|
|
elm.notify(signal.id, converter(v));
|
|
|
|
} catch(e) {
|
|
|
|
port.internal.errorHandler(v);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return signal;
|
|
|
|
}
|
|
|
|
}
|
2014-01-06 06:47:05 +00:00
|
|
|
|
2014-01-13 18:32:54 +00:00
|
|
|
function outgoingSignal(converter) {
|
|
|
|
return function(signal) {
|
|
|
|
var subscribers = []
|
|
|
|
function subscribe(handler) {
|
|
|
|
subscribers.push(handler);
|
|
|
|
}
|
|
|
|
function unsubscribe(handler) {
|
|
|
|
subscribers.pop(subscribers.indexOf(handler));
|
|
|
|
}
|
|
|
|
A2( Signal.lift, function(value) {
|
|
|
|
var val = converter(value);
|
|
|
|
var len = subscribers.length;
|
|
|
|
for (var i = 0; i < len; ++i) {
|
|
|
|
subscribers[i](val);
|
|
|
|
}
|
|
|
|
}, signal);
|
|
|
|
return { subscribe:subscribe, unsubscribe:unsubscribe };
|
2014-01-06 06:47:05 +00:00
|
|
|
}
|
|
|
|
}
|
2014-01-13 18:32:54 +00:00
|
|
|
|
2014-01-06 06:47:05 +00:00
|
|
|
function portIn(name, converter) {
|
2014-01-13 18:32:54 +00:00
|
|
|
var value = elm.ports.incoming[name];
|
|
|
|
if (!value) {
|
2014-01-06 06:47:05 +00:00
|
|
|
throw new Error("Initialization Error: port '" + name +
|
|
|
|
"' was not given an input!");
|
|
|
|
}
|
|
|
|
elm.ports.uses[name] += 1;
|
2014-01-13 18:32:54 +00:00
|
|
|
return converter(value);
|
2014-01-06 06:47:05 +00:00
|
|
|
}
|
2014-01-13 18:32:54 +00:00
|
|
|
function portOut(name, converter, value) {
|
|
|
|
elm.ports.outgoing[name] = converter(value);
|
|
|
|
return value;
|
2014-01-06 06:47:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return elm.Native.Ports.values = {
|
2014-01-13 18:32:54 +00:00
|
|
|
incomingSignal: incomingSignal,
|
|
|
|
outgoingSignal: outgoingSignal,
|
2014-01-06 06:47:05 +00:00
|
|
|
portOut: portOut,
|
|
|
|
portIn: portIn
|
|
|
|
};
|
|
|
|
};
|