module Main exposing (main) import Browser import Sort.Set exposing (Set) import Html exposing (Html, div, input, label, p, text, h3) import Html.Events exposing (onCheck) import Html.Attributes exposing (class, type_, id) import Modules exposing ( Module , all_modules , module_property , module_desc , module_sorter ) main: Program () Model Msg main = Browser.sandbox { init = init, update = update, view = view } -- INIT + Model type alias Model = { enabled_modules : Set Module } init : Model init = { enabled_modules = Sort.Set.empty module_sorter } -- UPDATE type Msg = ToggleModule Module Bool add_or_remove : Bool -> (a -> Set a -> Set a) add_or_remove active = if active then Sort.Set.insert else Sort.Set.remove update : Msg -> Model -> Model update msg model = case msg of ToggleModule mod enabled -> { model | enabled_modules = add_or_remove enabled mod model.enabled_modules } -- VIEW view_module_button : Set Module -> Module -> Html Msg view_module_button enabled mod = label (if Sort.Set.memberOf enabled mod then [class "active"] else []) [ input [ type_ "checkbox" , onCheck (ToggleModule mod) ] [] , h3 [] [ text (module_property .name mod) ] , p [] (module_desc mod) ] view : Model -> Html Msg view model = div [id "elm-area"] ( all_modules |> List.map (view_module_button model.enabled_modules) )