@@ -105,6 +105,41 @@ var Signal = function() {
105 height: Elm.Lift(function(p){return p[2];},[dimensions]) };
105 height: Elm.Lift(function(p){return p[2];},[dimensions]) };
108+ var Keyboard = { Raw : function() {
109+ var keysDown = Elm.Input(["Nil"]);
110+ var charPressed = Elm.Input(["Nothing"]);
111+ function remove(x,xs) {
112+ if (xs[0] === "Nil") return xs;
113+ if (xs[1] === x) return xs[2];
114+ return ["Cons", xs[1], remove(x,xs[2])];
116+ function has(x,xs) {
117+ while (xs[0] !== "Nil") {
118+ if (xs[1] === x) return true;
123+ addListener(document, 'keydown', function(e) {
124+ if (has(e.keyCode, keysDown.value)) return;
125+ Dispatcher.notify(keysDown.id, ["Cons", e.keyCode, keysDown.value]);
127+ addListener(document, 'keyup', function(e) {
128+ var codes = remove(e.keyCode, keysDown.value)
129+ Dispatcher.notify(keysDown.id, codes);
131+ addListener(window, 'blur', function(e) {
132+ Dispatcher.notify(keysDown.id, ["Nil"]);
134+ addListener(document, 'keypress', function(e) {
135+ Dispatcher.notify(charPressed.id, ["Just",e.charCode || e.keyCode]);
136+ Dispatcher.notify(charPressed.id, ["Nothing"]);
138+ return {keysDown:keysDown,
139+ charPressed:charPressed};
108 var HTTP = function() {
143 var HTTP = function() {
109 var fetch = function(how) { return function(url) {
144 var fetch = function(how) { return function(url) {
110 var thread = Elm.Input(["Waiting"]);
145 var thread = Elm.Input(["Waiting"]);
@@ -119,7 +154,7 @@ var Signal = function() {
119 : ["Failure", request.status, toElmString(request.statusText)]);
154 : ["Failure", request.status, toElmString(request.statusText)]);
122− request.open(how, String.toText(url), true);
157+ request.open(how, Data.String.toText(url), true);
123 request.send(null);
158 request.send(null);
124 return thread;
159 return thread;
@@ -147,7 +182,7 @@ var Signal = function() {
147 : ["Failure", request.status, toElmString(request.statusText)]]);
182 : ["Failure", request.status, toElmString(request.statusText)]]);
150− request.open(how, String.toText(strOpt[1]), true);
185+ request.open(how, Data.String.toText(strOpt[1]), true);
151 request.send(null);
186 request.send(null);
152 return [];
187 return [];
@@ -249,6 +284,11 @@ var Signal = function() {
249 button:button};
284 button:button};
252− return {Mouse:Mouse, Time:Time, Window:Window,
287+ return {Mouse:Mouse,
253− HTTP:HTTP, Random:Random, Input:Input };
292+ Random:Random,