uncover-co/elm-submodules/1.0.2

NOTE: the latest version is 1.1.0

SubModule

This module is used for plugging submodules into a host module. If you're working on the submodule itself, check out SubCmd.

{ toMsg : subMsg -> msg
, effectToMsg : subEffect -> msg
}
-> ( subModel, SubCmd subMsg subEffect )
-> ( subModel, ( model, Cmd msg ) -> ( model, Cmd msg ) )

Enables you to initialize submodules that can send effects.

let
    -- This submodule can't send effects
    ( subModule, initSubModule ) =
        SubModule.init
            |> SubModule.init
                { toMsg = GotSubMsg
                }


    -- But this one can!
    ( subModule2, initSubModule2 ) =
        SubModule2.init
            |> SubModule.initWithEffect
                { toMsg = GotSubMsg2
                , effectToMsg = GotSubEffect2
                }
in
( { subModule = subModule
  , subModule2 = subModule2
  }
, Cmd.none
)
    |> initSubModule
    |> initSubModule2
{ toModel : subModel -> model
, toMsg : subMsg -> msg
, effectToMsg : subEffect -> msg
}
-> ( subModel, SubCmd subMsg subEffect )
-> ( model, Cmd msg )

Enables you to handle the updates of submodules that can send effects.

type Msg
    = GotSubMsg SubWidget.Msg
    | GotSubEffect SubWidget.Effect


update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        GotSubMsg subMsg ->
            SubWidget.update subMsg model.subModel
                |> SubWidget.updateWithEffect
                    { toMsg = GotSubMsg
                    , effectToMsg = GotSubEffect
                    , toModel =
                        \subModel -> { model | subModel = subModel }
                    }


        GotSubEffect subEffect ->
            case subEffect of
                SubWidget.SendValue value ->
                    ( { model | subValue = Just value }
                    , Cmd.none
                    )

Modules without effect

We also provide a few functions to help you deal with modules that can't send effects so you have a similar API across your host module. Note that the same could be achieved without this package at all.

{ toMsg : subMsg -> msg }
-> ( subModel, Cmd subMsg )
-> ( subModel, ( model, Cmd msg ) -> ( model, Cmd msg ) )

Enables you to initialize multiple submodules that cannot send effects.

let
    ( subModule, initSubModule ) =
        SubModule.init
            |> SubModule.init
                { toMsg = SubModuleMsg
                }


    ( subModule2, initSubModule2 ) =
        SubModule2.init
            |> SubModule.init
                { toMsg = SubModule2Msg
                }
in
( { subModule = subModule, subModule2 = subModule2 }, Cmd.none )
    |> initSubModule
    |> initSubModule2
{ toModel : subModel -> model
, toMsg : subMsg -> msg
}
-> ( subModel, Cmd subMsg )
-> ( model, Cmd msg )

Enables you to handle the updates of submodules that cannot send effects.

type Msg
    = GotSubMsg SubWidget.Msg
    | ...


update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        GotSubMsg subMsg ->
            SubModule.update subMsg model.subModule
                |> SubModule.update
                    { toMsg = GotSubMsg
                    , toModel = \subModule -> { model | subModule = subModule }
                    }
        ...