-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
8 changed files
with
331 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
*.beam | ||
*.ez | ||
build | ||
erl_crash.dump |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
# Help | ||
|
||
## Running the tests | ||
|
||
To run the tests, run the command `gleam test` from within the exercise directory. | ||
|
||
## Submitting your solution | ||
|
||
You can submit your solution using the `exercism submit src/wine_cellar.gleam` command. | ||
This command will upload your solution to the Exercism website and print the solution page's URL. | ||
|
||
It's possible to submit an incomplete solution which allows you to: | ||
|
||
- See how others have completed the exercise | ||
- Request help from a mentor | ||
|
||
## Need to get help? | ||
|
||
If you'd like help solving the exercise, check the following pages: | ||
|
||
- The [Gleam track's documentation](https://exercism.org/docs/tracks/gleam) | ||
- The [Gleam track's programming category on the forum](https://forum.exercism.org/c/programming/gleam) | ||
- [Exercism's programming category on the forum](https://forum.exercism.org/c/programming/5) | ||
- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs) | ||
|
||
Should those resources not suffice, you could submit your (incomplete) solution to request mentoring. | ||
|
||
To get help if you're having trouble, you can use one of the following resources: | ||
|
||
- [gleam.run](https://gleam.run/documentation/) is the gleam official documentation. | ||
- [Discord](https://discord.gg/Fm8Pwmy) is the discord channel. | ||
- [StackOverflow](https://stackoverflow.com/questions/tagged/gleam) can be used to search for your problem and see if it has been answered already. You can also ask and answer questions. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
# Hints | ||
|
||
## 1. Get all wines of a given color | ||
|
||
- Keyword arguments are specified by writing a name before the argument name, separated by a space. | ||
- The [`list.filter`][list-filter] function can be used to select elements from a list that match a given predicate. | ||
|
||
## 2. Get all wines of a given color bottled in a given year | ||
|
||
- Keyword arguments are specified by writing a name before the argument name, separated by a space. | ||
- The [`list.filter`][list-filter] function can be used to select elements from a list that match a given predicate. | ||
|
||
## 3. Get all wines of a given color bottled in a given country | ||
|
||
- This function can be implemented by calling `wines_from_country` and then `wines_of_color` on the output. | ||
|
||
[list-filter]: https://hexdocs.pm/gleam_stdlib/gleam/list.html#filter |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,121 @@ | ||
# Wine Cellar | ||
|
||
Welcome to Wine Cellar on Exercism's Gleam Track. | ||
If you need help running the tests or submitting your code, check out `HELP.md`. | ||
If you get stuck on the exercise, check out `HINTS.md`, but try and solve it without using those first :) | ||
|
||
## Introduction | ||
|
||
## Labelled Arguments | ||
|
||
Sometimes when a function takes many arguments it can be difficult to remember the order they should be given in. To aid readability Gleam allows arguments to be labelled with a name. | ||
|
||
To label an argument specify the label name before the argument name, separated by a space. | ||
|
||
```gleam | ||
pub fn replace( | ||
in string: String, | ||
each target: String, | ||
with replacement: String | ||
) -> String { | ||
// ... | ||
} | ||
``` | ||
|
||
When calling a function with labelled arguments the arguments can be given in any order. Each of these calls to `replace` are equivalent: | ||
|
||
```gleam | ||
replace(in: "🍔🍔🍔" each: "🍔", with: "🍕") | ||
replace(each: "🍔", in: "🍔🍔🍔", with: "🍕") | ||
replace(with: "🍕", each: "🍔", in: "🍔🍔🍔") | ||
``` | ||
|
||
Labels are always optional. Even if a function has labelled arguments they can still be called without labels. | ||
|
||
```gleam | ||
replace("🍔🍔🍔", "🍔", "🍕") | ||
``` | ||
|
||
## Instructions | ||
|
||
You are the manager of a fancy restaurant that has a sizable wine cellar. A lot of your customers are demanding wine enthusiasts. Finding the right bottle of wine for a particular customer is not an easy task. | ||
|
||
As a tech-savvy restaurant owner, you decided to speed up the wine selection process by writing an app that will let guests filter your wines by their preferences. | ||
|
||
## 1. Get all wines of a given color | ||
|
||
A bottle of wine is represented using a custom type, and wines are stored in a list. | ||
|
||
```gleam | ||
[ | ||
Wine("Chardonnay", 2015, "Italy", White), | ||
Wine("Pinot grigio", 2017, "Germany", White), | ||
Wine("Pinot noir", 2016, "France", Red), | ||
Wine("Dornfelder", 2018, "Germany", Rose) | ||
] | ||
``` | ||
|
||
Implement the `wines_of_color` function. It should take a list of wines and return all wines of a given color. | ||
|
||
```gleam | ||
wines_of_color( | ||
[ | ||
Wine("Chardonnay", 2015, "Italy", White), | ||
Wine("Pinot grigio", 2017, "Germany", White), | ||
Wine("Pinot noir", 2016, "France", Red), | ||
Wine("Dornfelder", 2018, "Germany", Rose) | ||
], | ||
color: White | ||
) | ||
// -> [ | ||
// Wine("Chardonnay", 2015, "Italy", White), | ||
// Wine("Pinot grigio", 2017, "Germany", White), | ||
// ] | ||
``` | ||
|
||
## 2. Get all wines bottles in a given country | ||
|
||
Implement the `wines_from_country` function. It should take a list of wines and return all wines from a given country. | ||
|
||
```gleam | ||
wines_from_country( | ||
[ | ||
Wine("Chardonnay", 2015, "Italy", White), | ||
Wine("Pinot grigio", 2017, "Germany", White), | ||
Wine("Pinot noir", 2016, "France", Red), | ||
Wine("Dornfelder", 2018, "Germany", Rose) | ||
], | ||
country: "Germany" | ||
) | ||
// -> [ | ||
// Wine("Dornfelder", 2018, "Germany", Rose) | ||
// ] | ||
``` | ||
|
||
## 3. Get all wines of a given color bottled in a given country | ||
|
||
Implement the `filter` function. It should take a list of wines, a color and a country and return all wines of the given color bottled in the given country. | ||
|
||
```gleam | ||
filter( | ||
[ | ||
Wine("Chardonnay", 2015, "Italy", White), | ||
Wine("Pinot grigio", 2017, "Germany", White), | ||
Wine("Pinot noir", 2016, "France", Red), | ||
Wine("Dornfelder", 2018, "Germany", Rose) | ||
], | ||
color: White | ||
country: "Italy" | ||
) | ||
// -> [ | ||
// Wine("Chardonnay", 2015, "Italy", White), | ||
// ] | ||
``` | ||
|
||
## Source | ||
|
||
### Created by | ||
|
||
- @lpil |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
name = "wine_cellar" | ||
version = "0.1.0" | ||
|
||
[dependencies] | ||
gleam_bitwise = "~> 1.2" | ||
gleam_otp = "~> 0.7 or ~> 1.0" | ||
gleam_stdlib = "~> 0.32 or ~> 1.0" | ||
simplifile = "~> 1.0" | ||
gleam_erlang = ">= 0.25.0 and < 1.0.0" | ||
|
||
[dev-dependencies] | ||
exercism_test_runner = "~> 1.4" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
# This file was generated by Gleam | ||
# You typically do not need to edit this file | ||
|
||
packages = [ | ||
{ name = "argv", version = "1.0.1", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "A6E9009E50BBE863EB37D963E4315398D41A3D87D0075480FC244125808F964A" }, | ||
{ name = "exercism_test_runner", version = "1.7.0", build_tools = ["gleam"], requirements = ["argv", "gap", "glance", "gleam_community_ansi", "gleam_erlang", "gleam_json", "gleam_stdlib", "simplifile"], otp_app = "exercism_test_runner", source = "hex", outer_checksum = "2FC1BADB19BEC2AE77BFD2D3A606A014C85412A7B874CAFC4BA8CF04B0B257CD" }, | ||
{ name = "gap", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_stdlib"], otp_app = "gap", source = "hex", outer_checksum = "2EE1B0A17E85CF73A0C1D29DA315A2699117A8F549C8E8D89FA8261BE41EDEB1" }, | ||
{ name = "glance", version = "0.8.2", build_tools = ["gleam"], requirements = ["gleam_stdlib", "glexer"], otp_app = "glance", source = "hex", outer_checksum = "ACF09457E8B564AD7A0D823DAFDD326F58263C01ACB0D432A9BEFDEDD1DA8E73" }, | ||
{ name = "gleam_bitwise", version = "1.3.1", build_tools = ["gleam"], requirements = [], otp_app = "gleam_bitwise", source = "hex", outer_checksum = "B36E1D3188D7F594C7FD4F43D0D2CE17561DE896202017548578B16FE1FE9EFC" }, | ||
{ name = "gleam_community_ansi", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "FE79E08BF97009729259B6357EC058315B6FBB916FAD1C2FF9355115FEB0D3A4" }, | ||
{ name = "gleam_community_colour", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "A49A5E3AE8B637A5ACBA80ECB9B1AFE89FD3D5351FF6410A42B84F666D40D7D5" }, | ||
{ name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, | ||
{ name = "gleam_json", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "8B197DD5D578EA6AC2C0D4BDC634C71A5BCA8E7DB5F47091C263ECB411A60DF3" }, | ||
{ name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, | ||
{ name = "gleam_stdlib", version = "0.36.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "C0D14D807FEC6F8A08A7C9EF8DFDE6AE5C10E40E21325B2B29365965D82EB3D4" }, | ||
{ name = "glexer", version = "0.7.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glexer", source = "hex", outer_checksum = "4484942A465482A0A100936E1E5F12314DB4B5AC0D87575A7B9E9062090B96BE" }, | ||
{ name = "simplifile", version = "1.5.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "EB9AA8E65E5C1E3E0FDCFC81BC363FD433CB122D7D062750FFDF24DE4AC40116" }, | ||
{ name = "thoas", version = "0.4.1", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "4918D50026C073C4AB1388437132C77A6F6F7C8AC43C60C13758CC0ADCE2134E" }, | ||
] | ||
|
||
[requirements] | ||
exercism_test_runner = { version = "~> 1.4" } | ||
gleam_bitwise = { version = "~> 1.2" } | ||
gleam_erlang = { version = ">= 0.25.0 and < 1.0.0"} | ||
gleam_otp = { version = "~> 0.7 or ~> 1.0" } | ||
gleam_stdlib = { version = "~> 0.32 or ~> 1.0" } | ||
simplifile = { version = "~> 1.0" } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
import gleam/list | ||
|
||
pub fn wines_of_color(wines: List(Wine), color: Color) -> List(Wine) { | ||
list.filter(wines, keeping: fn(wine) { wine.color == color }) | ||
} | ||
|
||
pub fn wines_from_country(wines: List(Wine), country: String) -> List(Wine) { | ||
list.filter(wines, keeping: fn(wine) { wine.country == country }) | ||
} | ||
|
||
pub fn filter( | ||
wines: List(Wine), | ||
color color: Color, | ||
country country: String, | ||
) -> List(Wine) { | ||
wines | ||
|> wines_of_color(color) | ||
|> wines_from_country(country) | ||
} | ||
|
||
pub type Wine { | ||
Wine(name: String, year: Int, country: String, color: Color) | ||
} | ||
|
||
pub type Color { | ||
Red | ||
Rose | ||
White | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
import exercism/should | ||
import exercism/test_runner | ||
import wine_cellar.{Red, Rose, White, Wine} | ||
|
||
const cellar = [ | ||
Wine("Chardonnay", 2015, "Italy", White), | ||
Wine("Chardonnay", 2014, "France", White), | ||
Wine("Dornfelder", 2018, "Germany", Rose), | ||
Wine("Merlot", 2015, "France", Red), | ||
Wine("Riesling", 2017, "Germany", White), | ||
Wine("Pinot grigio", 2015, "Germany", White), | ||
Wine("Pinot noir", 2016, "France", Red), | ||
Wine("Pinot noir", 2013, "Italy", Red), | ||
] | ||
|
||
pub fn main() { | ||
test_runner.main() | ||
} | ||
|
||
pub fn wines_of_color_white_test() { | ||
cellar | ||
|> wine_cellar.wines_of_color(White) | ||
|> should.equal([ | ||
Wine("Chardonnay", 2015, "Italy", White), | ||
Wine("Chardonnay", 2014, "France", White), | ||
Wine("Riesling", 2017, "Germany", White), | ||
Wine("Pinot grigio", 2015, "Germany", White), | ||
]) | ||
} | ||
|
||
pub fn wines_of_color_red_test() { | ||
cellar | ||
|> wine_cellar.wines_of_color(Red) | ||
|> should.equal([ | ||
Wine("Merlot", 2015, "France", Red), | ||
Wine("Pinot noir", 2016, "France", Red), | ||
Wine("Pinot noir", 2013, "Italy", Red), | ||
]) | ||
} | ||
|
||
pub fn wines_of_color_rose_test() { | ||
cellar | ||
|> wine_cellar.wines_of_color(Rose) | ||
|> should.equal([Wine("Dornfelder", 2018, "Germany", Rose)]) | ||
} | ||
|
||
pub fn wines_from_country_france_test() { | ||
cellar | ||
|> wine_cellar.wines_from_country("France") | ||
|> should.equal([ | ||
Wine("Chardonnay", 2014, "France", White), | ||
Wine("Merlot", 2015, "France", Red), | ||
Wine("Pinot noir", 2016, "France", Red), | ||
]) | ||
} | ||
|
||
pub fn wines_from_country_germany_test() { | ||
cellar | ||
|> wine_cellar.wines_from_country("Germany") | ||
|> should.equal([ | ||
Wine("Dornfelder", 2018, "Germany", Rose), | ||
Wine("Riesling", 2017, "Germany", White), | ||
Wine("Pinot grigio", 2015, "Germany", White), | ||
]) | ||
} | ||
|
||
pub fn wines_from_country_scotland_test() { | ||
cellar | ||
|> wine_cellar.wines_from_country("Scotland") | ||
|> should.equal([]) | ||
} | ||
|
||
pub fn filter_white_germany_test() { | ||
cellar | ||
|> wine_cellar.filter(color: White, country: "Germany") | ||
|> should.equal([ | ||
Wine("Riesling", 2017, "Germany", White), | ||
Wine("Pinot grigio", 2015, "Germany", White), | ||
]) | ||
} | ||
|
||
pub fn filter_red_france_test() { | ||
cellar | ||
|> wine_cellar.filter(country: "France", color: Red) | ||
|> should.equal([ | ||
Wine("Merlot", 2015, "France", Red), | ||
Wine("Pinot noir", 2016, "France", Red), | ||
]) | ||
} |