I maybe post it differently.
I have this small program that asynchronously reading data from JSON file
and displays it as an array.
import Html exposing (..)
import Html.App as App
import Http
import Table exposing (defaultCustomizations)
import Task
import Json.Decode as Json exposing ((:=))
main =
App.program
{ init = init
, update = update
, view = view
, subscriptions = \_ -> Sub.none
}
-- MODEL
type alias Job =
{ task : String
, who : String
, place : String
}
type alias Jobs = List Job
type alias Model =
{ jobs : Maybe Jobs
, tableState : Table.State
}
init : ( Model, Cmd Msg )
init =
( { jobs = Nothing
, tableState = Table.initialSort "Year"
}
, getJson
)
-- UPDATE
type Msg
= SetTableState Table.State
| FetchSucceed (Maybe Jobs)
| FetchFail Http.Error
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
SetTableState newState ->
( { model | tableState = newState }
, Cmd.none
)
FetchSucceed jobs ->
( {model | jobs = jobs}
, Cmd.none
)
FetchFail _ ->
(model, Cmd.none)
-- VIEW
view : Model -> Html Msg
view { jobs, tableState } =
div [] [ viewJobs jobs tableState ]
viewJobs maybeJobs tableState =
case maybeJobs of
Nothing ->
text "No jobs to display"
Just jobs ->
Table.view config tableState jobs
-- TABLE CONFIGURATION
config : Table.Config Job Msg
config =
Table.customConfig
{ toId = .task
, toMsg = SetTableState
, columns =
[ Table.stringColumn "Task" .task
, Table.stringColumn "Who" .who
, Table.stringColumn "Place" .place
]
, customizations =
defaultCustomizations
}
-- HTTP
getJson : Cmd Msg
getJson =
Task.perform FetchFail FetchSucceed (Http.get decoderColl "jobs.json" |>
Task.toMaybe)
decoder : Json.Decoder Job
decoder =
Json.object3 Job
("task" := Json.string)
("who" := Json.string)
("place" := Json.string)
decoderColl : Json.Decoder Jobs
decoderColl =
Json.object1 identity
("jobs" := Json.list decoder)
Now I have the second usecase when same data has to be printed out as a
list. My question is is there a way to re-use JSON reading routine?
--
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.