Totally redo the HTTP API. Get rid of Maybe in types because the signal filtering functions make them unnecessary. Make requests more flexible with the request function which lets you set the type, url, data, and set request headers.

This commit is contained in:
evancz 2012-10-04 00:41:33 -04:00
parent 6a4cf28866
commit f4344dcb59

View file

@ -182,57 +182,62 @@ var Signal = function() {
}; };
var HTTP = function() { var HTTP = function() {
var fetch = function(how) { return function(url) {
var thread = Elm.Input(["Waiting"]); function request(verb) { return function(url) { return function(data) {
var request = {}; return function(headers) {
if (window.XMLHttpRequest) { request = new XMLHttpRequest(); } return {0 : "Request",
else if (window.ActiveXObject) { request = new ActiveXObject("Microsoft.XMLHTTP"); } length : 1,
request.onreadystatechange = function(e) { verb : Foreign.JavaScript.castStringToJSString(verb),
if (request.readyState === 4) { url : Foreign.JavaScript.castStringToJSString(url),
Dispatcher.notify(thread.id, data : data === null ? null : Foreign.JavaScript.castStringToJSString(data),
request.status === 200 headers : headers }; }; }; };
? ["Success", toElmString(request.responseText)] }
: ["Failure", request.status, toElmString(request.statusText)]); function get(url) { return request("GET")(url)(null)(["Nil"]); }
} function post(url) { return function(data) {
}; return request("POST")(url)(data)(["Nil"]); }; }
request.open(how, Value.toText(url), true);
request.send(null); function sendReq(responses) { return function(req) {
return thread; Dispatcher.notify(responses.id,["Waiting"]);
}; var request = null;
if (window.XMLHttpRequest) {
request = new XMLHttpRequest();
} else if (window.ActiveXObject) {
request = new ActiveXObject("Microsoft.XMLHTTP");
}
request.onreadystatechange = function(e) {
if (request.readyState === 4) {
Dispatcher.notify(
responses.id,
request.status === 200
? ["Success", toElmString(request.responseText)]
: ["Failure", request.status, toElmString(request.statusText)]);
}
}; };
var fetches = function(how) { return function(input) { request.open(req.verb, req.url, true);
var output = Elm.Input(["Nothing"]); List.map(function(pair) {
var fetcher = Elm.Lift(update, [input]); request.setRequestHeader(
var combine = Elm.Lift(function(x) { return function(y) { return x; } }, [output,fetcher]); Foreign.JavaScript.castStringToJSString(pair[1]),
function update(strOpt) { Foreign.JavaScript.castStringToJSString(pair[2]));
if (strOpt[0] !== "Just") { })(req.headers);
try { Dispatcher.notify(output.id, ["Nothing"]); } catch(e) {} request.send(req.data);
return []; return null;
} };
try { }
Dispatcher.notify(output.id, ["Just", ["Waiting"]]);
} catch(e) { output.value = ["Just", ["Waiting"]]; } function send(requests) {
var request = {}; var responses = Elm.Input(["Waiting"]);
if (window.XMLHttpRequest) { request = new XMLHttpRequest(); } var sender = Elm.Lift(sendReq(responses), [requests]);
else if (window.ActiveXObject) { request = new ActiveXObject("Microsoft.XMLHTTP"); } var combine = Elm.Lift(function(x){return function(y){return x;}},
request.onreadystatechange = function(e) { [responses,sender]);
if (request.readyState === 4) { return combine;
Dispatcher.notify(output.id, }
["Just", request.status === 200
? ["Success", toElmString(request.responseText)] return {get : get,
: ["Failure", request.status, toElmString(request.statusText)]]); post : post,
} request : request,
}; send : send,
request.open(how, Value.toText(strOpt[1]), true); sendGet : function(urls){return send(Elm.Lift(get,[urls]));}
request.send(null); };
return [];
}
return combine;
};
};
return {get : fetch("GET"), post : fetch("POST"),
gets : fetches("GET"), posts : fetches("POST")
};
}(); }();
var Random = function() { var Random = function() {
var inRange = function(min) { return function(max) { var inRange = function(min) { return function(max) {