Makes sense but doesn't change much: (|>) is expecting the right side to be a: Http.Request Shows -> a But the > right side is: Http.Request (Maybe Shows) -> Cmd Msg
On Wednesday, November 16, 2016 at 9:40:45 PM UTC+1, Peter Damoc wrote: > > Ok, first, try simply removing Http.toTask as that is not needed at all > there. > > triggerReadingFromJson = > Http.get "shows.json" decoderColl > |> Http.send handleRequest > > And second, you need a full URL for the "shows.json" not just a file name. > > > > > On Wed, Nov 16, 2016 at 10:26 PM, Tim Bezhashvyly <[email protected] > <javascript:>> wrote: > >> Here is my full program: >> >> import Html exposing (..) >> import Http >> import Table exposing (defaultCustomizations) >> import Json.Decode as Json exposing (field) >> import Task >> >> >> >> main = >> Html.program >> { init = init >> , update = update >> , view = view >> , subscriptions = \_ -> Sub.none >> } >> >> >> >> -- MODEL >> >> type alias Show = >> { date : String >> , format : String >> , city : String >> } >> >> type alias Shows = List Show >> >> type alias Model = >> { shows : Maybe Shows >> , tableState : Table.State >> } >> >> >> init : ( Model, Cmd Msg ) >> init = >> ( { shows = Nothing >> , tableState = Table.initialSort "Date" >> } >> , triggerReadingFromJson >> ) >> >> >> >> -- UPDATE >> >> >> type Msg >> = SetTableState Table.State >> | FetchSucceed (Maybe Shows) >> | FetchFail Http.Error >> >> >> update : Msg -> Model -> ( Model, Cmd Msg ) >> update msg model = >> case msg of >> SetTableState newState -> >> ( { model | tableState = newState } >> , Cmd.none >> ) >> >> FetchSucceed shows -> >> ( {model | shows = shows} >> , Cmd.none >> ) >> >> FetchFail _ -> >> (model, Cmd.none) >> >> >> -- VIEW >> >> >> view : Model -> Html Msg >> view { shows, tableState } = >> div [] [ viewShows shows tableState ] >> >> viewShows maybeShows tableState = >> case maybeShows of >> Nothing -> >> text "No shows to display" >> Just shows -> >> Table.view config tableState shows >> >> >> -- TABLE CONFIGURATION >> >> >> config : Table.Config Show Msg >> config = >> Table.customConfig >> { toId = .date >> , toMsg = SetTableState >> , columns = >> [ Table.stringColumn "Date" .date >> , Table.stringColumn "Format" .format >> , Table.stringColumn "City" .city >> ] >> , customizations = >> defaultCustomizations >> } >> >> >> >> -- HTTP >> >> >> triggerReadingFromJson = >> Http.toTask (Http.get "shows.json" decoderColl) >> |> Http.send handleRequest >> >> >> decoder : Json.Decoder Show >> decoder = >> Json.map3 Show >> (field "date" Json.string) >> (field "format" Json.string) >> (field "city" Json.string) >> >> >> decoderColl : Json.Decoder Shows >> decoderColl = >> Json.map identity >> (field "shows" (Json.list decoder)) >> >> >> handleRequest result = >> case result of >> Ok val -> >> FetchSucceed val >> Err err -> >> FetchFail err >> >> >> >> On Wednesday, November 16, 2016 at 9:19:46 PM UTC+1, Peter Damoc wrote: >>> >>> The JSON failures are encapsulated in your Maybe, it should not pose any >>> problem. It is defensive programming and it is just fine. >>> >>> You need to provide a full function, ideally complete with signatures, >>> in order for me to try to understand why do you get that specific compiler >>> error. >>> >>> What I provided has only two lines and should have worked (in theory). >>> If you have altered it in a way that somehow reintroduces Tasks back, I >>> need to see some code in order to try to figure out what's going on there. >>> >>> >>> >>> >>> >>> >>> On Wed, Nov 16, 2016 at 10:07 PM, Tim Bezhashvyly <[email protected]> >>> wrote: >>> >>>> This gives me >>>> >>>> (|>) is expecting the right side to be a: Task.Task Http.Error MyType >>>>> -> a But the right side is: Http.Request (Maybe MyType) -> Cmd Msg >>>> >>>> >>>> but maybe this is an artefact of old 0.17 architecture where I was too >>>> defensive for the case if reading JSON fails. >>>> >>>> Sorry for trowing just an exception message but I'm really not sure how >>>> to proceed here. :( >>>> >>>> And thank you for all your support so far. >>>> >>>> On Wednesday, November 16, 2016 at 8:25:23 PM UTC+1, Peter Damoc wrote: >>>> >>>>> >>>>> On Wed, Nov 16, 2016 at 8:19 PM, Tim Bezhashvyly <[email protected] >>>>> > wrote: >>>>> >>>>>> You mean something like: >>>>>> >>>>>> triggerReadingFromJson = >>>>>> Http.toTask (Http.get "my.json" decoder) >>>>>> |> Task.andThen (\result -> Task.succeed result) >>>>>> |> Task.onError (\error -> Task.fail error) >>>>>> >>>>>> Task.andThen is used when you need to chain multiple requests like >>>>> asking for some info from one endpoint and using the information received >>>>> to make another call to a different endpoint based on the received info >>>>> and >>>>> encapsulate that into one, single, request so you get only one message. >>>>> >>>>> For what it looks like you try to accomplish, you just need to create >>>>> the Request and use Http.send to convert it into a Cmd (the command that >>>>> sends the request to the server) >>>>> >>>>> triggerReadingFromJson = >>>>> Http.get myJsonUrl decoder >>>>> |> Http.send (Result.Extra.unpack FailMessage SuccessMessage) >>>>> >>>>> I've used the helper suggested by Janis so you need to >>>>> install elm-community/result-extra and add it to your dependencies. :) >>>>> >>>>> >>>>> >>>>> >>>>> >>>>>> But in this case the result is "Task.Task Http.Error MyType". What >>>>>> can I do with it? I need somehow cast it to either MyType or Cmd, right? >>>>>> >>>>>> >>>>>> On Wednesday, November 16, 2016 at 3:23:13 PM UTC+1, Peter Damoc >>>>>> wrote: >>>>>> >>>>>>> On Wed, Nov 16, 2016 at 4:05 PM, Tim Bezhashvyly < >>>>>>> [email protected]> wrote: >>>>>>> >>>>>>>> Chained to Task.andThen and Task.onError? And what those tow must >>>>>>>> return? I assume commands as they can't change model directly, right? >>>>>>>> >>>>>>> >>>>>>> Chained with Task.andThen ;) >>>>>>> >>>>>>> As for the return type, I would return success and fail data and >>>>>>> only at the last stage map it onto the message creators. >>>>>>> The command is the equivalent of the Task in that it is a request >>>>>>> for some side effects. It is not the result of the side-effect. >>>>>>> The result of the side-effect is either some type decoded from some >>>>>>> Json that is received (in the case of usual requests to Json APIs) or >>>>>>> some >>>>>>> kind of error type. >>>>>>> >>>>>>> >>>>>>> So, in the case of Http, the final Cmd is a complex request that >>>>>>> encapsulates a series of Http requests and is able to produce either a >>>>>>> success msg or a fail msg. >>>>>>> The data that end up in the messages gets there as a result of the >>>>>>> execution of said Cmd. >>>>>>> Which of the messages (success or failure) ends up in your update is >>>>>>> also predicated on the execution of the Cmd. >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>>> On Wednesday, November 16, 2016 at 2:46:41 PM UTC+1, Peter Damoc >>>>>>>> wrote: >>>>>>>>> >>>>>>>>> Sorry, old habits. >>>>>>>>> >>>>>>>>> The Http API became Cmd oriented. You don't need Task.attempt. >>>>>>>>> Just use the regular Http.get and use the Cmds produced by it. >>>>>>>>> >>>>>>>>> If you need chaining, there is a `toTask` function that converts >>>>>>>>> Requests to Tasks >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On Wed, Nov 16, 2016 at 3:33 PM, Tim Bezhashvyly < >>>>>>>>> [email protected]> wrote: >>>>>>>>> >>>>>>>>>> Thank. This makes lots of sense in regards of first argument. >>>>>>>>>> >>>>>>>>>> What about the second? In 0.17 it could be for example: >>>>>>>>>> >>>>>>>>>> (Http.get "my.json" decoderFunction) >>>>>>>>>> >>>>>>>>>> But not it produced an error: >>>>>>>>>> >>>>>>>>>> Function `attempt` is expecting the 2nd argument to be: Task.Task >>>>>>>>>>> Http.Error (Maybe MyType) But it is: Http.Request MyType >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> On Wednesday, November 16, 2016 at 2:22:48 PM UTC+1, Peter Damoc >>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>> The old Task.perform was creating either a success message (if >>>>>>>>>>> it succeeded) or a fail message (if it failed) >>>>>>>>>>> The current Task.perform cannot fail. It is used for Tasks that >>>>>>>>>>> are known to succeed like requesting the window size or requesting >>>>>>>>>>> some >>>>>>>>>>> random number. >>>>>>>>>>> >>>>>>>>>>> The Task.attempt takes a function that takes a result (results >>>>>>>>>>> encapsulate both the success and the failure) and produces a >>>>>>>>>>> message based >>>>>>>>>>> on that result. >>>>>>>>>>> >>>>>>>>>>> You could define something like: >>>>>>>>>>> >>>>>>>>>>> handleRequest result = >>>>>>>>>>> case result of >>>>>>>>>>> Ok val -> >>>>>>>>>>> SuccessMessage val >>>>>>>>>>> Err err -> >>>>>>>>>>> FailMessage err >>>>>>>>>>> >>>>>>>>>>> and use it like this: >>>>>>>>>>> >>>>>>>>>>> someHttpCmd = Task.attempt handleRequest someHttpRequestTask >>>>>>>>>>> >>>>>>>>>>> Alternatively, you could just have only one message that takes a >>>>>>>>>>> Result and handle each case in that message's part of the update as >>>>>>>>>>> demonstrated by the Http example: >>>>>>>>>>> http://elm-lang.org/examples/http >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> On Wed, Nov 16, 2016 at 3:05 PM, Tim Bezhashvyly < >>>>>>>>>>> [email protected]> wrote: >>>>>>>>>>> >>>>>>>>>>>> Sorry again if something obvious but Im not sure how now to >>>>>>>>>>>> make async requests in 0.18.0. >>>>>>>>>>>> >>>>>>>>>>>> In 0.17.1 it was done with Task.perform where first parameter >>>>>>>>>>>> was a success Msg, second - fail Msg and third is the task which >>>>>>>>>>>> execution >>>>>>>>>>>> result is then passed to first function. >>>>>>>>>>>> >>>>>>>>>>>> As far as I understand now Task.attempt must be used but >>>>>>>>>>>> documentation is not quite comprehensive. Could someone please >>>>>>>>>>>> advise? >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> 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. >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> There is NO FATE, we are the creators. >>>>>>>>>>> blog: http://damoc.ro/ >>>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> 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. >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> There is NO FATE, we are the creators. >>>>>>>>> blog: http://damoc.ro/ >>>>>>>>> >>>>>>>> -- >>>>>>>> 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. >>>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> There is NO FATE, we are the creators. >>>>>>> blog: http://damoc.ro/ >>>>>>> >>>>>> -- >>>>>> 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. >>>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> There is NO FATE, we are the creators. >>>>> blog: http://damoc.ro/ >>>>> >>>> -- >>>> 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. >>>> >>> >>> >>> >>> -- >>> There is NO FATE, we are the creators. >>> blog: http://damoc.ro/ >>> >> -- >> 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] <javascript:>. >> For more options, visit https://groups.google.com/d/optout. >> > > > > -- > There is NO FATE, we are the creators. > blog: http://damoc.ro/ > -- 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.
