-
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
225 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/treasure_chest.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,13 @@ | ||
# Hints | ||
|
||
## 1. Define the TreasureChest generic custom type | ||
|
||
- The `TreasureChest` custom type only has a single variant. | ||
|
||
## 2. Define the UnlockResult generic custom type | ||
|
||
- The `UnlockResult` custom type has 2 variants, `Unlocked`, and `WrongPassword`. | ||
|
||
## 3. Define the get_treasure function | ||
|
||
- Custom types can be pattern matched on in the same way to access their values. |
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,94 @@ | ||
# Treasure Chest | ||
|
||
Welcome to Treasure Chest 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 | ||
|
||
## Generics | ||
|
||
A type is a _generic type_ when it can contain values of any type using a _type parameter_. | ||
|
||
For example, this `Box` type has the type parameter `a` (written with lowercase letters). | ||
|
||
```gleam | ||
pub type Box(a) { | ||
Box(a) | ||
} | ||
``` | ||
|
||
The `a` type parameter is a placeholder for any type, so `Box` can be used with strings, ints, or any other type. | ||
|
||
```gleam | ||
Box("Hello, Joe!") // The type is Box(String) | ||
Box(42) // The type is Box(Int) | ||
``` | ||
|
||
A type can have multiple type parameters by separating them with commas. | ||
|
||
```gleam | ||
pub type Pair(a, b) { | ||
Pair(a, b) | ||
} | ||
``` | ||
|
||
### Generic functions | ||
|
||
Type parameters can also be used in the arguments of functions. | ||
|
||
This function takes a value of the type `a` and calls twice a function that takes an `a` and returns a `b`. | ||
|
||
```gleam | ||
pub fn twice(value: a, f: fn(a) -> b) -> b { | ||
f(value) | ||
f(value) | ||
} | ||
``` | ||
```gleam | ||
// The type is fn(String, fn(String) -> Nil) -> Nil | ||
twice("Hello, Joe!", io.println) | ||
``` | ||
|
||
## Instructions | ||
|
||
In this exercise you're going to write a generic (/ magical!) TreasureChest, to store some treasure. | ||
|
||
## 1. Define the TreasureChest generic custom type | ||
|
||
Define a `TreasureChest` custom type with a single variant. | ||
|
||
The variant should have an associated `String` value, which will be used to store the password of the treasure chest. | ||
|
||
The variant should also have an associate generic value, which will be used to store the treasure. | ||
This value is generic so that the treasure can be anything. | ||
|
||
## 2. Define the UnlockResult type | ||
|
||
Define a `UnlockResult` custom type with two variants. | ||
|
||
The first variant should be `Unlocked`, and should hold generic value, which will be used to store the treasure. | ||
|
||
The second variant should be `WrongPassword`, which holds no values. | ||
|
||
## 3. Define the get_treasure function | ||
|
||
This function should take two parameters | ||
|
||
- a `TreasureChest` generic custom type | ||
- a `String` (for trying a password) | ||
|
||
This function should check the provided password attempt against the `String` in the `TreasureChest`. | ||
|
||
The function should return a `UnlockResult`. | ||
|
||
If the passwords match then return `Unlocked` with the generic value from the `TreasureChest` (the treasure!) | ||
|
||
If the passwords do not match then return `WrongPassword`. | ||
|
||
## 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,11 @@ | ||
name = "treasure_chest" | ||
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" | ||
|
||
[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,26 @@ | ||
# 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.24.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "26BDB52E61889F56A291CB34167315780EE4AA20961917314446542C90D1C1A0" }, | ||
{ 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_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,18 @@ | ||
pub type TreasureChest(treasure) { | ||
TreasureChest(password: String, treasure: treasure) | ||
} | ||
|
||
pub type UnlockResult(treasure) { | ||
Unlocked(treasure: treasure) | ||
WrongPassword | ||
} | ||
|
||
pub fn get_treasure( | ||
chest: TreasureChest(treasure), | ||
password: String, | ||
) -> UnlockResult(treasure) { | ||
case chest.password == password { | ||
True -> Unlocked(treasure: chest.treasure) | ||
False -> WrongPassword | ||
} | ||
} |
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 @@ | ||
import exercism/should | ||
import exercism/test_runner | ||
import treasure_chest.{TreasureChest, Unlocked, WrongPassword} | ||
|
||
pub fn main() { | ||
test_runner.main() | ||
} | ||
|
||
pub fn treasure_can_be_a_string_test() { | ||
TreasureChest("password", "treasure") | ||
} | ||
|
||
pub fn treasure_can_be_an_int_test() { | ||
TreasureChest("password", 5) | ||
} | ||
|
||
pub fn treasure_is_returned_if_correct_password_test() { | ||
TreasureChest("password", "treasure") | ||
|> treasure_chest.get_treasure("password") | ||
|> should.equal(Unlocked("treasure")) | ||
} | ||
|
||
pub fn wrong_password_is_returned_if_an_incorrect_password_is_used_test() { | ||
TreasureChest("password", "treasure") | ||
|> treasure_chest.get_treasure("wrong-password") | ||
|> should.equal(WrongPassword) | ||
} |