Just this morning I upgraded a 3500 line Elm 0.17 project to Elm 0.18. I 
wrote down my experience that I will share at a later date but I wanted to 
share a suggestion.

My app makes a handful of Http requests. For example I have a user model 
and Msgs for when the user logs in or out.

type alias Model =
    { username : String
    , fullName : String
    , password : String
    , email : String
    }

type Msg = 
    | Login
    | LoginSucceed Model
    | LoginFail Http.Error
    | Logout
    | LogoutSucceed
    | LogoutFail Http.Error

A typical 0.18 Http requests looks like this

performLogin : Model -> Cmd Msg
performLogin user =
    let
        request =
            Http.request
                { method = "POST"
                , headers = []
                , url = "http://mydomain/login";
                , body = Http.jsonBody (userEncoder user)
                , expect = Http.expectJson userDecoder
                , timeout = Nothing
                , withCredentials = False
                }
    in
        Http.send
            (\result ->
                case result of
                    Ok user ->
                        LoginSucceed user

                    Err err ->
                        LoginFail err
            )
            request

The `case result of` part in the Http.send argument is a lot of boilerplate 
that I don't like seeing copy/pasted in all of my Http Cmds.

Additionally, in most cases my success Msg takes a payload which is the 
model that was decoded from the response and my fail Msg takes the Result's 
Http.Error.

I have since created a helper function that looks like this

resultToMsg : (x -> b) -> (a -> b) -> Result x a -> b
resultToMsg errMsg okMsg result =
    case result of
        Ok a ->
            okMsg a

        Err err ->
            errMsg err


With that helper function my Http Cmds now look like this

performLogin : Model -> Cmd Msg
performLogin user =
    let
        request =
            Http.request
                { method = "POST"
                , headers = []
                , url = "http://mydomain/login";
                , body = Http.jsonBody (userEncoder user)
                , expect = Http.expectJson userDecoder
                , timeout = Nothing
                , withCredentials = False
                }
    in
        Http.send
            (resultToMsg LoginFail LoginSucceed)
            request

Which results in 4 fewer lines of boilerplate (5 including the whitespace).

I'm terrible at naming things but I propose adding a helper function to 
elm-lang/core Result with basically the implementation above but with a 
more appropriate name than resultToMsg.

-- 
You received this message because you are subscribed to the Google Groups "Elm 
Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to