Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A...

72
Type Inference of Asynchronous Arrows in JavaScript Eric Fritz Tian Zhao University of Wisconsin - Milwaukee 1 / 22

Transcript of Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A...

Page 1: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

Type Inference of Asynchronous Arrows in JavaScript

Eric Fritz Tian Zhao

University of Wisconsin - Milwaukee

1 / 22

Page 2: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

– 0 –Outline

JS Asynchronicity

Promises

Asynchronous Arrows

Type Inference Strategy

2 / 22

Page 3: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

– 0 –Outline

JS Asynchronicity

Promises

Asynchronous Arrows

Type Inference Strategy

2 / 22

Page 4: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

– 0 –Outline

JS Asynchronicity

Promises

Asynchronous Arrows

Type Inference Strategy

2 / 22

Page 5: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

– 0 –Outline

JS Asynchronicity

Promises

Asynchronous Arrows

Type Inference Strategy

2 / 22

Page 6: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

– 1 –JS Asynchronicity

3 / 22

Page 7: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

javascript event loop

stack

queue

main

click #foo

after 4after 3after 2after 1after 0

c

1

after 3after 2after 1after 0

c

2

handler1 handler2

handler1handler2

c

1

c

2

function handler1(ev) {setTimeout (() => $(this).css('color ', '#f00'), 4000);

}

function handler2(ev) {setTimeout (() => $(this).css('color ', '#00f'), 3000);

}

$('#foo').one('click ', handler1 );$('#foo').one('click ', handler2 );

4 / 22

Page 8: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

javascript event loop

stack

queue

main

click #foo

after 4after 3after 2after 1after 0

c

1

after 3after 2after 1after 0

c

2

handler1

handler2

handler1handler2

c

1

c

2

function handler1(ev) {setTimeout (() => $(this).css('color ', '#f00'), 4000);

}

function handler2(ev) {setTimeout (() => $(this).css('color ', '#00f'), 3000);

}

$('#foo').one('click ', handler1 );$('#foo').one('click ', handler2 );

4 / 22

Page 9: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

javascript event loop

stack

queue

main

click #foo

after 4after 3after 2after 1after 0

c

1

after 3after 2after 1after 0

c

2

handler1 handler2

handler1handler2

c

1

c

2

function handler1(ev) {setTimeout (() => $(this).css('color ', '#f00'), 4000);

}

function handler2(ev) {setTimeout (() => $(this).css('color ', '#00f'), 3000);

}

$('#foo').one('click ', handler1 );$('#foo').one('click ', handler2 );

4 / 22

Page 10: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

javascript event loop

stack

queue

main

click #foo

after 4after 3after 2after 1after 0

c

1

after 3after 2after 1after 0

c

2

handler1 handler2

handler1handler2

c

1

c

2

function handler1(ev) {setTimeout (() => $(this).css('color ', '#f00'), 4000);

}

function handler2(ev) {setTimeout (() => $(this).css('color ', '#00f'), 3000);

}

$('#foo').one('click ', handler1 );$('#foo').one('click ', handler2 );

4 / 22

Page 11: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

javascript event loop

stack

queue

main

click #foo

after 4after 3after 2after 1after 0

c

1

after 3after 2after 1after 0

c

2

handler1 handler2

handler1handler2

c

1

c

2

function handler1(ev) {setTimeout (() => $(this).css('color ', '#f00'), 4000);

}

function handler2(ev) {setTimeout (() => $(this).css('color ', '#00f'), 3000);

}

$('#foo').one('click ', handler1 );$('#foo').one('click ', handler2 );

4 / 22

Page 12: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

javascript event loop

stack

queue

main

click #foo

after 4

after 3after 2after 1after 0

c

1

after 3after 2after 1after 0

c

2

handler1 handler2

handler1

handler2

c

1

c

2

function handler1(ev) {setTimeout (() => $(this).css('color ', '#f00'), 4000);

}

function handler2(ev) {setTimeout (() => $(this).css('color ', '#00f'), 3000);

}

$('#foo').one('click ', handler1 );$('#foo').one('click ', handler2 );

4 / 22

Page 13: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

javascript event loop

stack

queue

main

click #foo

after 4

after 3

after 2after 1after 0

c

1

after 3after 2after 1after 0

c

2

handler1

handler2

handler1handler2

c

1

c

2

function handler1(ev) {setTimeout (() => $(this).css('color ', '#f00'), 4000);

}

function handler2(ev) {setTimeout (() => $(this).css('color ', '#00f'), 3000);

}

$('#foo').one('click ', handler1 );$('#foo').one('click ', handler2 );

4 / 22

Page 14: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

javascript event loop

stack

queue

main

click #foo

after 4after 3

after 2

after 1after 0

c

1

after 3

after 2after 1after 0

c

2

handler1

handler2

handler1

handler2

c

1

c

2

function handler1(ev) {setTimeout (() => $(this).css('color ', '#f00'), 4000);

}

function handler2(ev) {setTimeout (() => $(this).css('color ', '#00f'), 3000);

}

$('#foo').one('click ', handler1 );$('#foo').one('click ', handler2 );

4 / 22

Page 15: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

javascript event loop

stack

queue

main

click #foo

after 4after 3after 2

after 1

after 0

c

1

after 3

after 2

after 1after 0

c

2

handler1 handler2

handler1handler2

c

1

c

2

function handler1(ev) {setTimeout (() => $(this).css('color ', '#f00'), 4000);

}

function handler2(ev) {setTimeout (() => $(this).css('color ', '#00f'), 3000);

}

$('#foo').one('click ', handler1 );$('#foo').one('click ', handler2 );

4 / 22

Page 16: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

javascript event loop

stack

queue

main

click #foo

after 4after 3after 2after 1

after 0

c

1

after 3after 2

after 1

after 0

c

2

handler1 handler2

handler1handler2

c

1

c

2

function handler1(ev) {setTimeout (() => $(this).css('color ', '#f00'), 4000);

}

function handler2(ev) {setTimeout (() => $(this).css('color ', '#00f'), 3000);

}

$('#foo').one('click ', handler1 );$('#foo').one('click ', handler2 );

4 / 22

Page 17: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

javascript event loop

stack

queue

main

click #foo

after 4after 3after 2after 1after 0

c

1

after 3after 2after 1

after 0

c

2

handler1 handler2

handler1handler2

c

1

c

2

function handler1(ev) {setTimeout (() => $(this).css('color ', '#f00'), 4000);

}

function handler2(ev) {setTimeout (() => $(this).css('color ', '#00f'), 3000);

}

$('#foo').one('click ', handler1 );$('#foo').one('click ', handler2 );

4 / 22

Page 18: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

javascript event loop

stack

queue

main

click #foo

after 4after 3after 2after 1after 0

c

1

after 3after 2after 1

after 0

c

2

handler1 handler2

handler1handler2

c

1

c

2

function handler1(ev) {setTimeout (() => $(this).css('color ', '#f00'), 4000);

}

function handler2(ev) {setTimeout (() => $(this).css('color ', '#00f'), 3000);

}

$('#foo').one('click ', handler1 );$('#foo').one('click ', handler2 );

4 / 22

Page 19: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

javascript event loop

stack

queue

main

click #foo

after 4after 3after 2after 1after 0

c

1

after 3after 2after 1

after 0

c

2

handler1 handler2

handler1handler2

c

1

c

2

function handler1(ev) {setTimeout (() => $(this).css('color ', '#f00'), 4000);

}

function handler2(ev) {setTimeout (() => $(this).css('color ', '#00f'), 3000);

}

$('#foo').one('click ', handler1 );$('#foo').one('click ', handler2 );

4 / 22

Page 20: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

javascript event loop

stack

queue

main

click #foo

after 4after 3after 2after 1after 0

c

1

after 3after 2after 1after 0

c

2

handler1 handler2

handler1handler2

c

1

c

2

function handler1(ev) {setTimeout (() => $(this).css('color ', '#f00'), 4000);

}

function handler2(ev) {setTimeout (() => $(this).css('color ', '#00f'), 3000);

}

$('#foo').one('click ', handler1 );$('#foo').one('click ', handler2 );

4 / 22

Page 21: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

javascript event loop

stack

queue

main

click #foo

after 4after 3after 2after 1after 0

c

1

after 3after 2after 1after 0

c

2

handler1 handler2

handler1handler2

c

1

c

2

function handler1(ev) {setTimeout (() => $(this).css('color ', '#f00'), 4000);

}

function handler2(ev) {setTimeout (() => $(this).css('color ', '#00f'), 3000);

}

$('#foo').one('click ', handler1 );$('#foo').one('click ', handler2 );

4 / 22

Page 22: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

– 2 –Promises - A Solution

Promises/A and A+ (2009)

kriskowal/q (2010) & jQuery Deferred (2011)

ECMAScript 6 Native Promises (2015)

5 / 22

Page 23: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

– 2 –Promises - A Solution

Promises/A and A+ (2009)

kriskowal/q (2010) & jQuery Deferred (2011)

ECMAScript 6 Native Promises (2015)

5 / 22

Page 24: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

Promise (File Parsing)

readFile('config.json', function(err , text) {if (err) {

// Handle Read Error} else {

try {// Process

} catch (err) {// Handle Parse Error

}}

});

readFile('config.json').catch(err => /* Handle Read Error */).then(text => /* Process */).catch(err => /* Handle Parse Error */);

6 / 22

Page 25: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

– 3 –Asynchronous Arrows

Generalizing Monads to Arrows (Hughes 2000)

Arrowlets (Khoo 2009)

7 / 22

Page 26: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

– 3 –Asynchronous Arrows

Generalizing Monads to Arrows (Hughes 2000)

Arrowlets (Khoo 2009)

7 / 22

Page 27: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

arrows

c

a

b

Go!

p

yield

async point

progress event

b

progress event

Elem Event

1 let a = new EventArrow('click ');2 let b = ...3 let x = a.seq(b);4

5 let c = new ElemArrow('#enter ');6 let y = c.seq(x);7 let p = y.run ();8 ...9 p.cancel ();

8 / 22

Page 28: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

arrows

c

a

b

Go!

p

yield

async point

progress event

b

progress event

Elem Event

1 let a = new EventArrow('click ');2 let b = ...3 let x = a.seq(b);4

5 let c = new ElemArrow('#enter ');6 let y = c.seq(x);7 let p = y.run ();8 ...9 p.cancel ();

8 / 22

Page 29: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

arrows

c

a

b

Go!

p

yield

async point

progress event

b

progress event

Elem Event

1 let a = new EventArrow('click ');2 let b = ...3 let x = a.seq(b);4

5 let c = new ElemArrow('#enter ');6 let y = c.seq(x);7 let p = y.run ();8 ...9 p.cancel ();

8 / 22

Page 30: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

arrows

c

a

b

Go!

p

yield

async point

progress event

b

progress event

Elem Event

1 let a = new EventArrow('click ');2 let b = ...3 let x = a.seq(b);4

5 let c = new ElemArrow('#enter ');6 let y = c.seq(x);7 let p = y.run ();8 ...9 p.cancel ();

8 / 22

Page 31: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

arrows

c a

b

Go!

p

yield

async point

progress event

b

progress event

Elem Event

1 let a = new EventArrow('click ');2 let b = ...3 let x = a.seq(b);4

5 let c = new ElemArrow('#enter ');6 let y = c.seq(x);7 let p = y.run ();8 ...9 p.cancel ();

8 / 22

Page 32: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

arrows

c a

b

Go!

p

yield

async point

progress event

b

progress event

Elem Event

1 let a = new EventArrow('click ');2 let b = ...3 let x = a.seq(b);4

5 let c = new ElemArrow('#enter ');6 let y = c.seq(x);7 let p = y.run ();8 ...9 p.cancel ();

8 / 22

Page 33: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

arrows

c a

b

Go!

p

yield

async point

progress event

b

progress event

Elem Event

1 let a = new EventArrow('click ');2 let b = ...3 let x = a.seq(b);4

5 let c = new ElemArrow('#enter ');6 let y = c.seq(x);7 let p = y.run ();8 ...9 p.cancel ();

8 / 22

Page 34: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

all combinator (parallel, unordered load)

ajax

2

done

ajax

1

ajax

3

let done = function(data1 , data2 , data3) { ... }let ajax1 = new AjaxArrow (() => { url: '/item/1');let ajax2 = new AjaxArrow (() => { url: '/item/2');let ajax3 = new AjaxArrow (() => { url: '/item/3');

let loadAll = Arrow.all(ajax1 , ajax2 , ajax3 ).seq(done.lift ());

9 / 22

Page 35: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

repeat combinator (chunked array processing)

process

update

v

v

0 hloop : v 0iv

0v

00hhalt : v 00i

function processChunk(array , start) {for (let i = start; i < start + 100 && i < array.length; i++) {

processElem(array[i]);}

return start >= array.length? Arrow.halt() // base case: Arrow.loop([array , start + 100]); // enable feedback

}

let processArray = processChunk.lift ().tap(update ). repeat ();

10 / 22

Page 36: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

repeat combinator (chunked array processing)

process

update

v

v

0 hloop : v 0i

v

0v

00hhalt : v 00i

function processChunk(array , start) {for (let i = start; i < start + 100 && i < array.length; i++) {

processElem(array[i]);}

return start >= array.length? Arrow.halt() // base case: Arrow.loop([array , start + 100]); // enable feedback

}

let processArray = processChunk.lift ().tap(update ). repeat ();

10 / 22

Page 37: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

repeat combinator (chunked array processing)

process

update

v

v

0 hloop : v 0i

v

0v

00hhalt : v 00i

function processChunk(array , start) {for (let i = start; i < start + 100 && i < array.length; i++) {

processElem(array[i]);}

return start >= array.length? Arrow.halt() // base case: Arrow.loop([array , start + 100]); // enable feedback

}

let processArray = processChunk.lift ().tap(update ). repeat ();

10 / 22

Page 38: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

any combinator (asynchronous timeout)

ajax

process

delay

timeout

let process = ...let timeout = ...

let fetch = Arrow.any(new AjaxArrow (() => { url: '/items ' }). seq(process),new DelayArrow (30*1000). seq(timeout),

);

11 / 22

Page 39: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

any combinator (asynchronous timeout)

ajax

process

delay

timeout

let process = ...let timeout = ...

let fetch = Arrow.any(new AjaxArrow (() => { url: '/items ' }). seq(process),new DelayArrow (30*1000). seq(timeout),

);

11 / 22

Page 40: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

any combinator (asynchronous timeout)

ajax

process

delay

timeout

let process = ...let timeout = ...

let fetch = Arrow.any(new AjaxArrow (() => { url: '/items ' }). seq(process),new DelayArrow (30*1000). seq(timeout),

);

11 / 22

Page 41: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

noemit combinator (complex asynchronous timeout)

win

delay

loss

1 let win = ...2 let loss = ...3 let play = ...4 play = noemit(play);5

6 let timedGame = Arrow.any(7 play.seq(win),8 new DelayArrow (30*1000). seq(loss),9 );

12 / 22

Page 42: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

noemit combinator (complex asynchronous timeout)

win

delay

loss

1 let win = ...2 let loss = ...3 let play = ...4 play = noemit(play);5

6 let timedGame = Arrow.any(7 play.seq(win),8 new DelayArrow (30*1000). seq(loss),9 );

12 / 22

Page 43: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

noemit combinator (complex asynchronous timeout)

win

delay

loss

1 let win = ...2 let loss = ...3 let play = ...4 play = noemit(play);5

6 let timedGame = Arrow.any(7 play.seq(win),8 new DelayArrow (30*1000). seq(loss),9 );

12 / 22

Page 44: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

noemit combinator (complex asynchronous timeout)

win

delay

loss

1 let win = ...2 let loss = ...3 let play = ...4 play = noemit(play);5

6 let timedGame = Arrow.any(7 play.seq(win),8 new DelayArrow (30*1000). seq(loss),9 );

12 / 22

Page 45: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

try (ajax failure)

ajax

process

failure

String

uncaught error

let process = ...let failure = ...

let fetch = Arrow.try(new AjaxArrow(url => { 'url': url })process ,failure ,

);

13 / 22

Page 46: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

try (ajax failure)

ajax

process

failure

String

uncaught error

let process = ...let failure = ...

let fetch = Arrow.try(new AjaxArrow(url => { 'url': url })process ,failure ,

);

13 / 22

Page 47: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

try (ajax failure)

ajax

process

failure

String

uncaught error

let process = ...let failure = ...

let fetch = Arrow.try(new AjaxArrow(url => { 'url': url })process ,failure ,

);

13 / 22

Page 48: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

try (ajax failure)

ajax

process

failure

String

uncaught error

let process = ...let failure = ...

let fetch = Arrow.try(new AjaxArrow(url => { 'url': url })process ,failure ,

);

13 / 22

Page 49: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

– 4 –Type Inference Strategy

14 / 22

Page 50: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

Memory (Sample Application)

var selectOne = select.lift().on('click ').whileTrue ();

var round = Arrow.id().tap(clear).seq(selectOne).seq(selectOne).seq(validate.lift ()).carry ().wait (500).tap(freeze).wait (500);

var game = Arrow.id().tap(round).seq(cardsLeft.lift ()).whileTrue ();

var play = initialize.lift().wait (1000).seq(game).seq(won.lift ());

15 / 22

Page 51: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

Memory (Topology)

Event

s

r

. . .. . .

c

. . .. . .

. . .

Cannot read property ‘on’ of null

Elem

Elem

()

16 / 22

Page 52: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

Memory (Topology)

Event

s

r

. . .. . .

c

. . .. . .

. . .

Cannot read property ‘on’ of null

Elem

Elem

()

16 / 22

Page 53: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

Memory (Topology)

Event

s

r

. . .. . .

c

. . .. . .

. . .

Cannot read property ‘on’ of null

Elem

Elem

()

16 / 22

Page 54: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

Memory (Topology)

Event

s

r

. . .. . .

c

. . .. . .

. . .

Cannot read property ‘on’ of null

Elem

Elem

()

16 / 22

Page 55: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

Memory (Topology)

Event

s

r

. . .. . .

c

. . .. . .

. . .

Cannot read property ‘on’ of null

Elem Elem

()

16 / 22

Page 56: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

Memory (Topology)

Event

s

r

. . .. . .

c

. . .. . .

. . .

Cannot read property ‘on’ of null

Elem Elem

()

16 / 22

Page 57: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

Memory (Topology)

Event

s

r

. . .. . .

c

. . .

. . .

. . .

Cannot read property ‘on’ of null

Elem Elem

()

16 / 22

Page 58: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

arrow type

⇠⌧ ::= ⌧

in

; ⌧out

\ ( C , E )

Set of subtype constraints ⌧ ⌧

Set of possible exceptions types

Examples

IElem ; (Event,Bool)

I ↵ ; � \ ({↵ �}, ;)I

String ; [Number ] \ (;, {AjaxError ,ValidationError})

17 / 22

Page 59: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

arrow type

⇠⌧ ::= ⌧

in

; ⌧out

\ ( C , E )

Set of subtype constraints ⌧ ⌧

Set of possible exceptions types

ExamplesI

Elem ; (Event,Bool)

I ↵ ; � \ ({↵ �}, ;)I

String ; [Number ] \ (;, {AjaxError ,ValidationError})

17 / 22

Page 60: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

combinator type (constraint example)

a

i

: ⌧i

; ⌧ 0i

\ (Ci

, E

i

), C

0i

= {↵ ⌧i

, ⌧ 0i

�}

any(a1

, . . . , an

) : ↵ ; � \ ([

C

0i

[[

C

i

,[

E

i

)

All arrows receive the same input

Any arrow may produce the combinator’s result

Any arrow may still throw exception from any arrow

18 / 22

Page 61: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

combinator type (exceptions example)

a

i

: ⌧i

; ⌧ 0i

\ (Ci

, E

i

)

C

0 = {⌧ 01

⌧2

, ⌧ 02

�, ⌧ 03

�} [ { ⌧ ⌧3

| ⌧ 2 E

1

}

try(a1

, a2

, a3

) : ⌧1

; � \ (C 0 [[

C

i

, E

2

[ E

3

)

Exception handler might be called

Exceptions cannot leak from a

1

Exception handler must accept all errors produced by a

1

19 / 22

Page 62: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

Type Inference

Event

s

� ; �

Elem ; Event

↵ ; (↵,↵)(Elem,Event) ; Bool

(�,Elem) ; (�,Event)

↵ ; (�,Event) \ ({↵ �,↵ Elem}, ;)

Elem ; Bool

20 / 22

Page 63: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

Type Inference

Event

s

� ; �

Elem ; Event

↵ ; (↵,↵)(Elem,Event) ; Bool

(�,Elem) ; (�,Event)

↵ ; (�,Event) \ ({↵ �,↵ Elem}, ;)

Elem ; Bool

20 / 22

Page 64: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

Type Inference

Event

s

� ; �

Elem ; Event

↵ ; (↵,↵)(Elem,Event) ; Bool

(�,Elem) ; (�,Event)

↵ ; (�,Event) \ ({↵ �,↵ Elem}, ;)

Elem ; Bool

20 / 22

Page 65: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

Type Inference

Event

s

� ; �

Elem ; Event

↵ ; (↵,↵)

(Elem,Event) ; Bool

(�,Elem) ; (�,Event)

↵ ; (�,Event) \ ({↵ �,↵ Elem}, ;)

Elem ; Bool

20 / 22

Page 66: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

Type Inference

Event

s

� ; �

Elem ; Event

↵ ; (↵,↵)(Elem,Event) ; Bool

(�,Elem) ; (�,Event)

↵ ; (�,Event) \ ({↵ �,↵ Elem}, ;)

Elem ; Bool

20 / 22

Page 67: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

Type Inference

Event

s

� ; �

Elem ; Event

↵ ; (↵,↵)

(Elem,Event) ; Bool

(�,Elem) ; (�,Event)

↵ ; (�,Event) \ ({↵ �,↵ Elem}, ;)

Elem ; Bool

20 / 22

Page 68: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

Type Inference

Event

s

� ; �

Elem ; Event

↵ ; (↵,↵)

(Elem,Event) ; Bool

(�,Elem) ; (�,Event)

↵ ; (�,Event) \ ({↵ �,↵ Elem}, ;)

Elem ; Bool

20 / 22

Page 69: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

Common Questions

Developer BurdenI Annotations are relatively infrequent

Performance OverheadI Tolerable in practice (types are minimized)I Type inference is pluggable - can (and should) be disabled

Why Not Promises?I No time to type-check Promises

21 / 22

Page 70: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

Common Questions

Developer BurdenI Annotations are relatively infrequent

Performance OverheadI Tolerable in practice (types are minimized)I Type inference is pluggable - can (and should) be disabled

Why Not Promises?I No time to type-check Promises

21 / 22

Page 71: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

Common Questions

Developer BurdenI Annotations are relatively infrequent

Performance OverheadI Tolerable in practice (types are minimized)I Type inference is pluggable - can (and should) be disabled

Why Not Promises?I No time to type-check Promises

21 / 22

Page 72: Type Inference of Asynchronous Arrows in JavaScript - REBLS2015.pdf · –2– Promises - A Solution Promises/A and A+ (2009) kriskowal/q (2010) & jQuery Deferred (2011) ECMAScript

– Thank You –

22 / 22