Slide 1

Slide 1 text

days / Kraków / 19.02.2016 FUNCTIONAL WEB APPS Michał Płachta @miciek PURELY SUCH PURE

Slide 2

Slide 2 text

days / Kraków / 19.02.2016 @miciek Let’s create a full-blown web application

Slide 3

Slide 3 text

days / Kraków / 19.02.2016 @miciek MAIN DEV GOALS ■ explicit external dependencies ■ explicit side effects ■ explicit configuration ■ explicit error handling pure functions & strong types Solution:

Slide 4

Slide 4 text

days / Kraków / 19.02.2016 @miciek Gitlab

Slide 5

Slide 5 text

days / Kraków / 19.02.2016 @miciek Merge Request Stats Gitlab Our app

Slide 6

Slide 6 text

days / Kraków / 19.02.2016 @miciek Application Architecture Gitlab Server Merge Request Fetcher MR Stats Web Service In Memory Storage MR Stats Web Application data flow

Slide 7

Slide 7 text

days / Kraków / 19.02.2016 @miciek Haskell & Elm Gitlab Server Merge Request Fetcher MR Stats Web Service In Memory Storage MR Stats Web Application Elm data flow

Slide 8

Slide 8 text

days / Kraków / 19.02.2016 @miciek One slide Haskell tutorial

Slide 9

Slide 9 text

days / Kraków / 19.02.2016 @miciek Using Servant as HTTP Client

Slide 10

Slide 10 text

days / Kraków / 19.02.2016 @miciek Haskell Servant ■ set of libraries ■ for HTTP related stuff ■ DRY ■ type safe ■ type level DSL

Slide 11

Slide 11 text

days / Kraków / 19.02.2016 @miciek Let’s start with the Fetcher Gitlab Server Merge Request Fetcher MR Stats Web Service In Memory Storage MR Stats Web Application data flow

Slide 12

Slide 12 text

days / Kraków / 19.02.2016 @miciek Gitlab API

Slide 13

Slide 13 text

days / Kraków / 19.02.2016 @miciek Merge Request JSON

Slide 14

Slide 14 text

days / Kraków / 19.02.2016 @miciek Merge Request Data Type

Slide 15

Slide 15 text

days / Kraków / 19.02.2016 @miciek Evil smiley face emoticon :>

Slide 16

Slide 16 text

days / Kraków / 19.02.2016 @miciek API Type /api/v3/projects/{projectId}/merge_requests/?page={page}

Slide 17

Slide 17 text

days / Kraków / 19.02.2016 @miciek apiQuery Function Type URL to query

Slide 18

Slide 18 text

days / Kraków / 19.02.2016 @miciek queryApi Return Type EitherT ServantError IO Paged [MergeRequest]

Slide 19

Slide 19 text

days / Kraków / 19.02.2016 @miciek IO Type IO Paged [MergeRequest] ■ side effecting ■ an action ■ e.g. get something from the server ■ can’t get rid of it Nope

Slide 20

Slide 20 text

days / Kraków / 19.02.2016 @miciek Quick IO Side Note What’s the difference? Examples from Haskell

Slide 21

Slide 21 text

days / Kraków / 19.02.2016 @miciek EitherT EitherT ServantError IO ■ can be either Left or Right ■ Left contains ServantError ■ Right contains IO a

Slide 22

Slide 22 text

days / Kraków / 19.02.2016 @miciek apiQuery implementation client is a Servant function that looks at our type and provides the implementation

Slide 23

Slide 23 text

days / Kraków / 19.02.2016 @miciek Nicer API with AppConfig

Slide 24

Slide 24 text

days / Kraków / 19.02.2016 @miciek pagedMergeRequests function ■ Maybe a type can be ○ Just a ○ Nothing

Slide 25

Slide 25 text

days / Kraków / 19.02.2016 @miciek allMergeRequests function uses

Slide 26

Slide 26 text

days / Kraków / 19.02.2016 @miciek allMergeRequests implementation EitherT ServantError IO context pagedResponse has type Paged [MergeRequest]

Slide 27

Slide 27 text

days / Kraków / 19.02.2016 @miciek Side Effects without IO?

Slide 28

Slide 28 text

days / Kraków / 19.02.2016 @miciek Merge Request Fetcher module

Slide 29

Slide 29 text

days / Kraków / 19.02.2016 @miciek Same story: Comments

Slide 30

Slide 30 text

days / Kraków / 19.02.2016 @miciek Business Logic: Stats Calculations ■ title ■ create date ■ last update date ■ upvotes ■ downvotes ■ list of comments ■ Merge Request object ■ time to merge (calculated) ■ comments quantity (calculated) ■ url to the MR Merge Request (from Gitlab) Merge Request Stats (ours)

Slide 31

Slide 31 text

days / Kraków / 19.02.2016 @miciek calculateStats function NOOO IOooo!!! It’s good, right?

Slide 32

Slide 32 text

days / Kraków / 19.02.2016 @miciek fetchMRsAndSaveStats function

Slide 33

Slide 33 text

days / Kraków / 19.02.2016 @miciek Serving the stats

Slide 34

Slide 34 text

days / Kraków / 19.02.2016 @miciek main function

Slide 35

Slide 35 text

days / Kraków / 19.02.2016 @miciek We did it! Merge Request Fetcher MR Stats Web Service In Memory Storage

Slide 36

Slide 36 text

days / Kraków / 19.02.2016 @miciek Automatic JS client and Markdown!

Slide 37

Slide 37 text

days / Kraków / 19.02.2016 @miciek Let’s do the frontend Gitlab Server Merge Request Fetcher MR Stats Web Service In Memory Storage MR Stats Web Application ■ using Elm ■ merge request stats in a table ■ dynamically updated each 5 seconds

Slide 38

Slide 38 text

days / Kraków / 19.02.2016 @miciek Elm architecture Elm Runtime Model update Action New Model view Effect Html Object Elm Rendering

Slide 39

Slide 39 text

days / Kraków / 19.02.2016 @miciek Elm architecture in types

Slide 40

Slide 40 text

days / Kraków / 19.02.2016 @miciek Our Model

Slide 41

Slide 41 text

days / Kraków / 19.02.2016 @miciek Our Actions

Slide 42

Slide 42 text

days / Kraków / 19.02.2016 @miciek update Function

Slide 43

Slide 43 text

days / Kraków / 19.02.2016 @miciek mergeRequestsFetchEffect

Slide 44

Slide 44 text

days / Kraków / 19.02.2016 @miciek view = virtual DOM objects

Slide 45

Slide 45 text

days / Kraków / 19.02.2016 @miciek Effects are Data Elm Runtime MRs & refresh time update Tick or Update List Action MRs & refresh time view Tick or Fetch Effect MRs Table Object Elm Rendering

Slide 46

Slide 46 text

days / Kraków / 19.02.2016 @miciek Fame & Glory

Slide 47

Slide 47 text

days / Kraków / 19.02.2016 @miciek Time Travel Debugger See for yourself: http://debug.elm-lang.org/edit/Mario.elm

Slide 48

Slide 48 text

days / Kraków / 19.02.2016 @miciek Links ■ Backend project: https://github.com/miciek/mr-stats-haskell- servant ■ Frontend project: https://github.com/miciek/mr-stats-frontend- elm ■ Elm architecture tutorial: https://github.com/evancz/elm- architecture-tutorial ■ Haskell Servant: https://github.com/haskell-servant/servant ■ Let’s be mainstream - user-focused design in Elm: https://www. youtube.com/watch?v=oYk8CKH7OhE ■ Monad Transformers: https://www.youtube.com/watch? v=pzouxmWiemg ■ Make the backend team jealous - Elm in Production: https://www. youtube.com/watch?v=FV0DXNB94NE ■ Children do projects using Elm: http://outreach.mcmaster. ca/tutorials/shapes/shapes.html

Slide 49

Slide 49 text

days / Kraków / 19.02.2016 PURELY FUNCTIONAL WEB APPS Michał Płachta www.michalplachta.com @miciek THANK YOU!