This repository has been archived by the owner. It is now read-only.
Permalink
Fetching contributors…
Cannot retrieve contributors at this time
480 lines (354 sloc) 8.82 KB
/*
import Elm.Kernel.Error exposing (throw)
import Elm.Kernel.Json exposing (run, wrap, unwrap)
import Elm.Kernel.List exposing (Cons, Nil)
import Elm.Kernel.Scheduler exposing (andThen, binding, rawSend, rawSpawn, receive, send, succeed)
import Elm.Kernel.Utils exposing (Tuple0)
import Result exposing (isOk)
*/
// PROGRAMS
var _Platform_worker = F4(function(impl, flagDecoder, debugMetadata, object)
{
object['worker'] = function(flags)
{
return _Platform_initialize(
flagDecoder,
flags,
impl.__$init,
impl.__$update,
impl.__$subscriptions,
function() { return function() {} }
);
};
return object;
});
// INITIALIZE A PROGRAM
function _Platform_initialize(flagDecoder, flags, init, update, subscriptions, stepperBuilder)
{
var result = A2(__Json_run, flagDecoder, __Json_wrap(flags));
__Result_isOk(result) || __Error_throw(2, result.a);
var managers = {};
result = init(result.a);
var model = result.a;
var stepper = stepperBuilder(sendToApp, model);
var ports = _Platform_setupEffects(managers, sendToApp);
function sendToApp(msg, viewMetadata)
{
result = A2(update, msg, model);
stepper(model = result.a, viewMetadata);
_Platform_dispatchEffects(managers, result.b, subscriptions(model));
}
_Platform_dispatchEffects(managers, result.b, subscriptions(model));
return ports ? { ports: ports } : {};
}
// TRACK PRELOADS
//
// This is used by code in elm-lang/browser and elm-lang/http
// to register any HTTP requests that are triggered by init.
//
var _Platform_preload;
function _Platform_registerPreload(url)
{
_Platform_preload.add(url);
}
// EFFECT MANAGERS
var _Platform_effectManagers = {};
function _Platform_setupEffects(managers, sendToApp)
{
var ports;
// setup all necessary effect managers
for (var key in _Platform_effectManagers)
{
var manager = _Platform_effectManagers[key];
if (manager.__portSetup)
{
ports = ports || {};
ports[key] = manager.__portSetup(key, sendToApp);
}
managers[key] = _Platform_instantiateManager(manager, sendToApp);
}
return ports;
}
function _Platform_createManager(init, onEffects, onSelfMsg, cmdMap, subMap)
{
return {
__init: init,
__onEffects: onEffects,
__onSelfMsg: onSelfMsg,
__cmdMap: cmdMap,
__subMap: subMap
};
}
function _Platform_instantiateManager(info, sendToApp)
{
var router = {
__sendToApp: sendToApp,
__selfProcess: undefined
};
var onEffects = info.__onEffects;
var onSelfMsg = info.__onSelfMsg;
var cmdMap = info.__cmdMap;
var subMap = info.__subMap;
function loop(state)
{
return A2(__Scheduler_andThen, loop, __Scheduler_receive(function(msg)
{
var value = msg.a;
if (msg.$ === __2_SELF)
{
return A3(onSelfMsg, router, value, state);
}
return cmdMap && subMap
? A4(onEffects, router, value.__cmds, value.__subs, state)
: A3(onEffects, router, cmdMap ? value.__cmds : value.__subs, state);
}));
}
return router.__selfProcess = __Scheduler_rawSpawn(A2(__Scheduler_andThen, loop, info.__init));
}
// ROUTING
var _Platform_sendToApp = F2(function(router, msg)
{
return __Scheduler_binding(function(callback)
{
router.__sendToApp(msg);
callback(__Scheduler_succeed(__Utils_Tuple0));
});
});
var _Platform_sendToSelf = F2(function(router, msg)
{
return A2(__Scheduler_send, router.__selfProcess, {
$: __2_SELF,
a: msg
});
});
// BAGS
function _Platform_leaf(home)
{
return function(value)
{
return {
$: __2_LEAF,
__home: home,
__value: value
};
};
}
function _Platform_batch(list)
{
return {
$: __2_NODE,
__bags: list
};
}
var _Platform_map = F2(function(tagger, bag)
{
return {
$: __2_MAP,
__func: tagger,
__bag: bag
}
});
// PIPE BAGS INTO EFFECT MANAGERS
function _Platform_dispatchEffects(managers, cmdBag, subBag)
{
var effectsDict = {};
_Platform_gatherEffects(true, cmdBag, effectsDict, null);
_Platform_gatherEffects(false, subBag, effectsDict, null);
for (var home in managers)
{
__Scheduler_rawSend(managers[home], {
$: 'fx',
a: effectsDict[home] || { __cmds: __List_Nil, __subs: __List_Nil }
});
}
}
function _Platform_gatherEffects(isCmd, bag, effectsDict, taggers)
{
switch (bag.$)
{
case __2_LEAF:
var home = bag.__home;
var effect = _Platform_toEffect(isCmd, home, taggers, bag.__value);
effectsDict[home] = _Platform_insert(isCmd, effect, effectsDict[home]);
return;
case __2_NODE:
for (var list = bag.__bags; list.b; list = list.b) // WHILE_CONS
{
_Platform_gatherEffects(isCmd, list.a, effectsDict, taggers);
}
return;
case __2_MAP:
_Platform_gatherEffects(isCmd, bag.__bag, effectsDict, {
__tagger: bag.__func,
__rest: taggers
});
return;
}
}
function _Platform_toEffect(isCmd, home, taggers, value)
{
function applyTaggers(x)
{
for (var temp = taggers; temp; temp = temp.__rest)
{
x = temp.__tagger(x);
}
return x;
}
var map = isCmd
? _Platform_effectManagers[home].__cmdMap
: _Platform_effectManagers[home].__subMap;
return A2(map, applyTaggers, value)
}
function _Platform_insert(isCmd, newEffect, effects)
{
effects = effects || { __cmds: __List_Nil, __subs: __List_Nil };
isCmd
? (effects.__cmds = __List_Cons(newEffect, effects.__cmds))
: (effects.__subs = __List_Cons(newEffect, effects.__subs));
return effects;
}
// PORTS
function _Platform_checkPortName(name)
{
if (_Platform_effectManagers[name])
{
__Error_throw(3, name)
}
}
// OUTGOING PORTS
function _Platform_outgoingPort(name, converter)
{
_Platform_checkPortName(name);
_Platform_effectManagers[name] = {
__cmdMap: _Platform_outgoingPortMap,
__converter: converter,
__portSetup: _Platform_setupOutgoingPort
};
return _Platform_leaf(name);
}
var _Platform_outgoingPortMap = F2(function(tagger, value) { return value; });
function _Platform_setupOutgoingPort(name)
{
var subs = [];
var converter = _Platform_effectManagers[name].__converter;
// CREATE MANAGER
var init = __Scheduler_succeed(null);
_Platform_effectManagers[name].__init = init;
_Platform_effectManagers[name].__onEffects = F3(function(router, cmdList, state)
{
for ( ; cmdList.b; cmdList = cmdList.b) // WHILE_CONS
{
// grab a separate reference to subs in case unsubscribe is called
var currentSubs = subs;
var value = __Json_unwrap(converter(cmdList.a));
for (var i = 0; i < currentSubs.length; i++)
{
currentSubs[i](value);
}
}
return init;
});
// PUBLIC API
function subscribe(callback)
{
subs.push(callback);
}
function unsubscribe(callback)
{
// copy subs into a new array in case unsubscribe is called within a
// subscribed callback
subs = subs.slice();
var index = subs.indexOf(callback);
if (index >= 0)
{
subs.splice(index, 1);
}
}
return {
subscribe: subscribe,
unsubscribe: unsubscribe
};
}
// INCOMING PORTS
function _Platform_incomingPort(name, converter)
{
_Platform_checkPortName(name);
_Platform_effectManagers[name] = {
__subMap: _Platform_incomingPortMap,
__converter: converter,
__portSetup: _Platform_setupIncomingPort
};
return _Platform_leaf(name);
}
var _Platform_incomingPortMap = F2(function(tagger, finalTagger)
{
return function(value)
{
return tagger(finalTagger(value));
};
});
function _Platform_setupIncomingPort(name, sendToApp)
{
var subs = __List_Nil;
var converter = _Platform_effectManagers[name].__converter;
// CREATE MANAGER
var init = __Scheduler_succeed(null);
_Platform_effectManagers[name].__init = init;
_Platform_effectManagers[name].__onEffects = F3(function(router, subList, state)
{
subs = subList;
return init;
});
// PUBLIC API
function send(incomingValue)
{
var result = A2(__Json_run, converter, __Json_wrap(incomingValue));
__Result_isOk(result) || __Error_throw(4, name, result.a);
var value = result.a;
for (var temp = subs; temp.b; temp = temp.b) // WHILE_CONS
{
sendToApp(temp.a(value));
}
}
return { send: send };
}
// EXPORT ELM MODULES
//
// Have DEBUG and PROD versions so that we can (1) give nicer errors in
// debug mode and (2) not pay for the bits needed for that in prod mode.
//
function _Platform_export__PROD(exports)
{
scope['Elm']
? _Platform_mergeExportsProd(scope['Elm'], exports)
: scope['Elm'] = exports;
}
function _Platform_mergeExportsProd(obj, exports)
{
for (var name in exports)
{
(name in obj)
? (typeof name === 'function')
? __Error_throw(6)
: _Platform_mergeExportsProd(obj[name], exports[name])
: (obj[name] = exports[name]);
}
}
function _Platform_export__DEBUG(exports)
{
scope['Elm']
? _Platform_mergeExportsDebug('Elm', scope['Elm'], exports)
: scope['Elm'] = exports;
}
function _Platform_mergeExportsDebug(moduleName, obj, exports)
{
for (var name in exports)
{
(name in obj)
? (typeof name === 'function')
? __Error_throw(6, moduleName)
: _Platform_mergeExportsDebug(moduleName + '.' + name, obj[name], exports[name])
: (obj[name] = exports[name]);
}
}