Merge pull request #383 from asarhaddon/ada2tco-do
[jackhill/mal.git] / elm / step1_read_print.elm
1 port module Main exposing (..)
2
3 import IO exposing (..)
4 import Json.Decode exposing (decodeValue)
5 import Platform exposing (programWithFlags)
6 import Types exposing (MalExpr(..))
7 import Reader exposing (readString)
8 import Printer exposing (printStr)
9
10
11 main : Program Flags Model Msg
12 main =
13 programWithFlags
14 { init = init
15 , update = update
16 , subscriptions =
17 \model -> input (decodeValue decodeIO >> Input)
18 }
19
20
21 type alias Flags =
22 { args : List String
23 }
24
25
26 type alias Model =
27 { args : List String
28 }
29
30
31 type Msg
32 = Input (Result String IO)
33
34
35 init : Flags -> ( Model, Cmd Msg )
36 init flags =
37 ( flags, readLine prompt )
38
39
40 update : Msg -> Model -> ( Model, Cmd Msg )
41 update msg model =
42 case msg of
43 Input (Ok (LineRead (Just line))) ->
44 case rep line of
45 Just out ->
46 ( model, writeLine out )
47
48 Nothing ->
49 ( model, readLine prompt )
50
51 Input (Ok LineWritten) ->
52 ( model, readLine prompt )
53
54 Input (Ok (LineRead Nothing)) ->
55 ( model, Cmd.none )
56
57 Input (Ok io) ->
58 Debug.crash "unexpected IO received: " io
59
60 Input (Err msg) ->
61 Debug.crash msg ( model, Cmd.none )
62
63
64 prompt : String
65 prompt =
66 "user> "
67
68
69 {-| read can return three things:
70
71 Ok (Just expr) -> parsed okay
72 Ok Nothing -> empty string (only whitespace and/or comments)
73 Err msg -> parse error
74
75 -}
76 read : String -> Result String (Maybe MalExpr)
77 read =
78 readString
79
80
81 eval : MalExpr -> MalExpr
82 eval ast =
83 ast
84
85
86 print : MalExpr -> String
87 print =
88 printStr True
89
90
91 {-| Read-Eval-Print
92 -}
93 rep : String -> Maybe String
94 rep =
95 let
96 formatResult result =
97 case result of
98 Ok optStr ->
99 optStr
100
101 Err msg ->
102 Just msg
103 in
104 readString
105 >> Result.map (Maybe.map (eval >> print))
106 >> formatResult