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
}type Movie =
Movie
{ title : String
, rating : Int
, director : Maybe String
}
fromTitle : String -> Movie -> Movie
fromTitle title =
Movie
{ title : title
, rating : 0
, director : Nothing
}
withRating : Int -> Movie -> Movie
withRating rating (Movie movie) =
{ movie | rating = clamp 1 5 rating }
withDirector : String -> Movie -> Movie
withDirector director (Movie movie) =
{ movie | director = director }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 5Further 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?