-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathDemoApp.fm
81 lines (72 loc) · 1.94 KB
/
DemoApp.fm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import App
// A demo App that displays screen coordinates
T DemoAppState
| demoappstate(
mousex : Number,
mousey : Number,
clicks : Number,
lastkey : Number
)
demo_app : App(DemoAppState)
// Application state
let state = demoappstate(0, 0, 0, 0)
// Application interface
let render = (state) =>
case state
| demoappstate =>
box("div", {"border": "1px solid black"}, [
// Title
box("h2", {}, [txt("Formality Demo App")]),
// Mouse position
box("h3", {}, [txt("Mouse position:")]),
box("ul", {}, [
box("li", {}, [txt("x:"), num(state.mousex)]),
box("li", {}, [txt("y:"), num(state.mousey)])
]),
// Click count
box("h3", {}, [txt("Mouse clicks:")]),
box("div", {}, [num(state.clicks)]),
// Last key
box("h3", {}, [txt("Last key press:")]),
box("div", {}, [num(state.lastkey)]),
// An image
img(#[64, 64], (pos) =>
get #[x,y] = pos
let r = ((x * 8 + state.mousex) % 256) || 0
let g = ((y * 8 + state.mousey) % 256) || 0
let b = 128
let c = 0xFF000000
let c = c || (b << 16)
let c = c || (g << 8)
let c = c || r
c),
])
// Application interaction
let update = (event, state) =>
case event
with state : DemoAppState
| mouseclick =>
case state
| demoappstate => demoappstate(
state.mousex,
state.mousey,
state.clicks + 1,
state.lastkey)
| mousemove =>
case state
| demoappstate => demoappstate(
event.x,
event.y,
state.clicks,
state.lastkey)
| keypress =>
case state
| demoappstate => demoappstate(
state.mousex,
state.mousey,
state.clicks,
event.key)
| keydown => state
| keyup => state
// Builds the application
app(DemoAppState; state, render, update)