Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import Dict exposing (Dict)
- import Html exposing (Html, div, text, input, ul, li)
- import Html.Events exposing (..)
- import Task exposing (Task)
- import String
- ---------------------------
- main =
- Html.program
- { init = init
- , view = view viewSuggestion
- , update = update getSuggestions
- , subscriptions = subscriptions
- }
- ---------------------------
- data : List String
- data =
- [ "Arizona"
- , "Arkansas"
- , "California"
- , "Colorado"
- , "Delaware"
- , "Florida"
- , "New York"
- , "New Jersey"
- , "Pennsylvania"
- , "Texas" ]
- attemptedSuggestions : String -> Result String (List suggestion) -> Msg suggestion
- attemptedSuggestions query result =
- case result of
- Ok suggestions ->
- AddSuggestions query suggestions
- Err _ ->
- NoOp
- getSuggestions : String -> Task String (List String)
- getSuggestions query =
- if String.trim query == ""
- then
- Task.fail "No Query"
- else
- (data
- |> List.filter (String.startsWith query)
- |> Task.succeed)
- ---------------------------
- type alias Model suggestion =
- { cache : Dict String (List suggestion)
- , query : String
- }
- type Msg suggestion
- = Query String
- | AddSuggestions String (List suggestion)
- | NoOp
- init : (Model suggestion, Cmd (Msg suggestion))
- init =
- ( { cache = Dict.empty
- , query = ""
- }
- , Cmd.none )
- subscriptions : Model suggestion -> Sub (Msg suggestion)
- subscriptions model =
- Sub.none
- update : (String -> Task String (List suggestion))
- -> Msg suggestion
- -> Model suggestion
- -> (Model suggestion, Cmd (Msg suggestion))
- update getSuggestions msg model =
- case msg of
- Query query ->
- let cmd =
- Task.attempt (attemptedSuggestions query) (getSuggestions query)
- in
- ( { model | query = query }
- , cmd )
- AddSuggestions query suggestions ->
- ( { model | cache = Dict.insert query suggestions model.cache }
- , Cmd.none )
- NoOp ->
- ( model
- , Cmd.none )
- view : (suggestion -> Html (Msg suggestion)) -> Model suggestion -> Html (Msg suggestion)
- view viewSuggestion model =
- let suggestions =
- case Dict.get model.query model.cache of
- Nothing ->
- []
- Just results ->
- results
- in
- div
- []
- [ input
- [ onInput Query ]
- [ ]
- , div
- []
- ( List.map viewSuggestion suggestions ) ]
- viewSuggestion : String -> Html a
- viewSuggestion suggestion =
- div
- []
- [ text suggestion ]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement