🌳
Walking though the Elm woods
  • Introduction
  • Structure of the book
  • Frequently asked questions
    • How can different types share data?
    • How to break Dependency Cycles?
    • How to structure an Elm project?
    • How to turn a Msg into a Cmd Msg?
    • How to update nested Records?
    • What are comparable types?
    • Why are Booleans bad?
    • 🔜Future topics
  • Recipes
    • Writing a Single Page Application
      • Share state across pages
      • Debounced Validation
      • Reusable views
    • Making impossible states Impossible
      • Non empty lists using Zippers
      • Restrict records using Opaque Types
      • Write safer functions using Phantom Types
    • Designing Elm package APIs
      • Create upwards compatible APIs
    • 🔜Future topics
  • Frameworks and packages
    • elm/parser
    • mdgriffith/elm-ui
    • 🔜Future topics
Powered by GitBook
On this page
  • Question
  • Answer
  • Further Reading

Was this helpful?

  1. Frequently asked questions

How to break Dependency Cycles?

Main.elm
import User exposing (User)

type Model =
    Maybe User

type Msg =
    UserSpecific User.Msg
    Login String String

update : Msg -> Model -> (Model,Cmd Msg)
update msg =
    case msg of
        UserSpecific userMsg ->
            User.update userMsg
        Login name pass ->
            Debug.todo "login user"
User.elm
import Main exposing (Msg)

type User =
    ..

type Msg =
    ..
    
updateUser : Msg -> User -> (Model,Cmd Msg)

viewUser : User -> Html Msg
Main.elm
import User exposing (User)

type Model =
    Maybe User

type Msg =
    UserSpecific User.Msg
    Login String String

update : Msg -> Model -> (Model,Cmd Msg)
update msg =
    case msg of
        UserSpecific userMsg ->
            User.update Just UserSpecific userMsg 
        Login name pass ->
            Debug.todo "login user"
User.elm
type User =
    ..

type Msg =
    ..
    
updateUser : (User -> model) -> (Msg -> msg) -> Msg -> User -> (model,Cmd msg)
Main.elm
import User exposing (User)

type Model =
    Maybe User

type Msg =
    UserSpecific User.Msg
    Login String String

update : Msg -> Model -> (Model,Cmd Msg)
update msg =
    case msg of
        UserSpecific userMsg ->
            let
                (user,msg) = User.update userMsg
            in
            (Just User,UserSpecific msg)
        Login name pass ->
            Debug.todo "login user"
User.elm
type User =
    ..

type Msg =
    ..
    
updateUser : Msg -> User -> (User,Cmd User.Msg)

Question

How to break out of the dependency cycles?

Answer

  1. Isolate the elements that both of the source modules need access to.

  2. Move the shared elements into a new module.

  3. Make the source module depend on the new Module.

Further Reading

PreviousHow can different types share data?NextHow to structure an Elm project?

Last updated 5 years ago

Was this helpful?

📄Article: by Matthew Buscemi

High-Level Dependency Strategies in Elm