Hi,

I come from an OOP background and trying to make the leap to keeping all 
state in a single immutable data store, which has shown to be amazing as 
long as the system is small, but I am having trouble scaling up to anything 
beyond a toy app.

One big challenge is trying to update nested fields. For example if I want 
to change a forecast parameter in the following code:

-- Model
type alias Forecast =
  { parameters: Pf.ArpsParameters
  , production: List Float
  }
type alias Model =
  { primaryForecast: Forecast
  , secondaryForecast: Forecast
  }

-- Init

init : (Model, Cmd Msg)
init =
  (
    { primaryForecast =
      { parameters =
        { q = Nothing
        , de = Nothing
        , c = Nothing
        , months = [0..48]
        }
      , production = []
      }
    }
    , Cmd.none
  )


I end up with code like this:

update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
  let
    primaryForecast = model.primaryForecast
    parameters = model.primaryForecast.parameters
  in
    case msg of
      Q string -> ({ model | primaryForecast = { primaryForecast | 
parameters = { parameters | q = toMaybe (String.toFloat string) } } }, 
message UpdateProduction)
      De string -> ({ model | primaryForecast = { primaryForecast | 
parameters = { parameters | de = toMaybe (String.toFloat string) } } }, 
message UpdateProduction)
      C string -> ({ model | primaryForecast = { primaryForecast | 
parameters = { parameters | c = toMaybe (String.toFloat string) } }}, 
message UpdateProduction)
      UpdateProduction -> ...


This seems unnecessarily verbose, and I'm unsure whether I am turning wrong 
with how I am structuring data or if I am trying to modify data incorrectly.

Thanks for any help!

Austin

-- 
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.

Reply via email to