Create upwards compatible APIs
type Movie =
Movie
{ title : String
, rating : Int
, -- adding a field will destroy the function below
}
new : String -> Int -> Movie
new title rating =
Movie
{ title = title
, rating = clamp 1 5 rating
}
Question
How can I define my type, such that I can add features without breaking the API?
Answer
First write a constructor fromTitle
that only uses as few arguments as possible.
Next add partial constructors for every feature of your type: withRating
and withDirector
.
Now creating a new Movie
can be done like this:
Movie.fromTitle "Life of Brian"
|> Movie.withDirector "Terry Jones"
|> Movie.withRating 5
Further Reading
📄Article: With* Functions in Elm by Charlie Koster
🎥Video: Robot Buttons from Mars by Brian Hicks
❗Example: NoRedInk/elm-json-decode-pipeline
❗Example: Chadtech/random-pipeline
❗Example: Particle Type from BrianHicks/elm-particle
❗Example: Request Type from dillonkearns/elm-graph
❗Example: Image Type from Orasund/pixelengine
Last updated
Was this helpful?