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.

Reply via email to