Two years of Elm (Dva roky Elmu)

A presentation at Devel.cz 2017 in April 2017 in Prague, Czechia by Robin Pokorny

Slide 1

Slide 1

DVA ROKY ELMU @robinpokorny

Slide 2

Slide 2

Dobrý pocit

Slide 3

Slide 3

Code OBR. 9.—Funkcionální JavaScript

Slide 4

Slide 4

ES200x Elm Ba be l OBR. 17.—Transkompilace TypeScript ClojureScript OCaml Dart …

Slide 5

Slide 5

React+x ElmArchitecture Angular Vue.js Polymer jQuery Ember.js Backbone … ES200x Elm Ba be l OBR. 17.—Transkompilace TypeScript ClojureScript OCaml Dart …

Slide 6

Slide 6

stejný problém + různé cesty porozumění

Slide 7

Slide 7

Chci po vás 2 roky hodiny

Slide 8

Slide 8

ROK PRVNÍ Elm jako jazyk

Slide 9

Slide 9

update : Msg !-> Model !-> ( Model, Cmd Msg ) update msg model = case msg of Add !-> { model | uid = model.uid + 1 , field = “” , entries = if String.isEmpty model.field then model.entries else model.entries !++ [ newEntry model.field ] } ! [] CheckAll isCompleted !-> let updateEntry t = { t | completed = isCompleted } in { model | entries = List.map updateEntry model.entries } ! []

Slide 10

Slide 10

An advanced, purely functional programming language

Slide 11

Slide 11

A delightful language for reliable webapps.

Slide 12

Slide 12

Main.elm OBR. 31.—Transkompilace Elmu

Slide 13

Slide 13

Main.elm OBR. 32.—Ztracené miliony

Slide 14

Slide 14

Main.elm „Předávají argument něčemu, co není funkce! Možná zapomněli na závorky? Nebo čárku?“ OBR. 33.—Perfektní hlášky

Slide 15

Slide 15

“foo” “bar” !— TYPE MISMATCH ————————————————You are giving an argument to something that is not a function! 3| “foo” “bar” ^^^^^ Maybe you forgot some parentheses? Or a comma?

Slide 16

Slide 16

“foo” + “bar” !— TYPE MISMATCH ———————————————————The left argument of (+) is causing a type mismatch. 3| “foo” + “bar” ^^^^^ (+) is expecting the left argument to be a: number But the left argument is: String Hint: To append strings in Elm, you need to use the (!++) operator, not (+). http:!//package.elm-lang.org/…

Slide 17

Slide 17

Main.elm OBR. 34.—Navrácené miliony

Slide 18

Slide 18

Main.elm v2.1.0 OBR. 35.—Balíčkovací systém

Slide 19

Slide 19

Main.elm v2.1.0

  • OBR. 36.—Ekosystém Elmu

Slide 20

Slide 20

Main.elm v2.1.0

  • OBR. 37.—Refaktoring

Slide 21

Slide 21

ROK DRUHÝ Elm jako přístup

Slide 22

Slide 22

Date.now() Math.random() * (6 - 1) + 1 const resp = await fetch(…) element.focus() window.innerWidth

Slide 23

Slide 23

Date.now() „řekni mi čas“ Math.random() * (6 - 1) + 1 „hoď kostkou a řekni mi, co vyšlo“ const resp = await fetch(…) „zaběhni na tuhle adresu a dones, co ti dají“ element.focus() window.innerWidth „přesuň kurzor támhle“ „změř mi aktuální šířku okna“

Slide 24

Slide 24

Cmd Msg

Slide 25

Slide 25

Cmd „hoď kostkou a řekni mi, co vyšlo“ Msg „výsledek hodu je 4“

Slide 26

Slide 26

Cmd Msg Random.generate NewFace (Random.int 1 6) NewFace 4

Slide 27

Slide 27

Cmd „Pro přednášku x mi z API zjisti twitter přednášejícího a řekni mi jej společně s x“ Msg „Twitter přednášejícího přednášky x je y“

Slide 28

Slide 28

Cmd Msg getSpeakerTwitter “elm” SpeakerTwitter “elm” “@robinpokorny”

Slide 29

Slide 29

getSpeakerTwitter : String !-> Cmd Msg getSpeakerTwitter talkId = let url = “https:!//api.devel.cz/konference/“ !++ talkId request = Http.get url decodeTwitterUrl !— 1 Http.send (SpeakerTwitter talkId) request !— 2 decodeTwitterUrl : Decode.Decoder String decodeTwitterUrl = Decode.at [“speaker”, “twitter”] Decode.string !— 3 in

Slide 30

Slide 30

Model View Update OBR. 42.—Aplikace OBR. 18.—Elm Runtime

Slide 31

Slide 31

onClick Msg1 Model View Update OBR. 42.—Aplikace OBR. 18.—Elm Runtime

Slide 32

Slide 32

onClick Msg1 Model stávající model & Msg1 View Update OBR. 42.—Aplikace OBR. 18.—Elm Runtime

Slide 33

Slide 33

onClick Msg1 Model stávající model & Msg1 nový model & Cmd View Update OBR. 42.—Aplikace OBR. 18.—Elm Runtime

Slide 34

Slide 34

onClick Msg1 Model stávající model & Msg1 nový model & Cmd View Cmd Msg2 Update OBR. 42.—Aplikace OBR. 18.—Elm Runtime

Slide 35

Slide 35

onClick Msg1 Model stávající model & Msg1 nový model & Cmd View Cmd Msg2 Update OBR. 42.—Aplikace stávající model & Msg2 OBR. 18.—Elm Runtime

Slide 36

Slide 36

onClick Msg1 Model stávající model & Msg1 nový model & Cmd View Cmd Msg2 Update OBR. 42.—Aplikace stávající model & Msg2 nový model & Cmd.none OBR. 18.—Elm Runtime

Slide 37

Slide 37

import Elm from ‘react-elm-components’ import { Todo } from ‘!../dist/elm/todomvc.js’ const setupPorts = (ports) !=> { ports.numActiveTodos.subscribe((n) !=> console.log(n)) } ports.todos.send(“Zarezervovat stůl v Čestru”) const TodoContainer = (list) !=> ( <div> <h1>Hele, mami, Elm v Reactu!!</h1> <Elm src={Todo} flags={{ todos: list }} ports={setupPorts} !/> ) !</div>

Slide 38

Slide 38

Slide 39

Slide 39

Slide 40

Slide 40

Float64Array

Slide 41

Slide 41

type alias Attributes = { position : Vec3, color : Vec3 } type alias Uniforms = { rotation : Mat4 } type alias Varyings = { vColor : Vec3 } vertexShader : Shader Attributes Uniforms Varyings vertexShader = [glsl| attribute vec3 position; attribute vec3 color; varying vec3 vColor; uniform mat4 rotation; void main () { gl_Position = rotation * vec4(position, 1.0); vColor = color; } |]

Slide 42

Slide 42

view : Float !-> Html a view angle = WebGL.toHtml [ width 300 , height 300 , style [(“display”, “block”)] ] [ WebGL.entity vertexShader fragmentShader triangle { rotation = makeRotate angle (vec3 0 1 0) } ]

Slide 43

Slide 43

„Díky Elmu jsem pochopil WebGL.“ Andrey Kuzmin maintaner elm-webgl

Slide 44

Slide 44

http://unsoundscapes.com/elm-webgl-playground/shadertoy.html

Slide 45

Slide 45

Slide 46

Slide 46

lm

Slide 47

Slide 47

elm @robinpokorny