tresure-chest

This commit is contained in:
Alexander Heldt
2025-11-02 16:11:11 +01:00
parent 64d2de2364
commit 5fb5492306
10 changed files with 261 additions and 0 deletions

View File

@@ -0,0 +1,24 @@
{
"authors": [
"lpil"
],
"files": {
"solution": [
"src/treasure_chest.gleam"
],
"test": [
"test/treasure_chest_test.gleam"
],
"exemplar": [
".meta/example.gleam"
],
"invalidator": [
"gleam.toml",
"manifest.toml"
]
},
"forked_from": [
"elm/treasure-chest"
],
"blurb": "Learn about generics in Gleam by creating a treasure chest"
}

View File

@@ -0,0 +1 @@
{"track":"gleam","exercise":"treasure-chest","id":"d49d66daaa134bd29dcc820a4dd0df29","url":"https://exercism.org/tracks/gleam/exercises/treasure-chest","handle":"fw353qwgs","is_requester":true,"auto_approve":false}

4
treasure-chest/.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
*.beam
*.ez
build
erl_crash.dump

32
treasure-chest/HELP.md Normal file
View File

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

13
treasure-chest/HINTS.md Normal file
View File

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

94
treasure-chest/README.md Normal file
View File

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

14
treasure-chest/gleam.toml Normal file
View File

@@ -0,0 +1,14 @@
name = "treasure_chest"
version = "0.1.0"
[dependencies]
gleam_otp = "~> 0.7 or ~> 1.0"
gleam_stdlib = ">= 0.54.0 or ~> 1.0"
simplifile = "~> 1.0"
gleam_erlang = ">= 0.25.0 and < 1.0.0"
gleam_yielder = ">= 1.1.0 and < 2.0.0"
gleam_regexp = ">= 1.1.0 and < 2.0.0"
gleam_deque = ">= 1.0.0 and < 2.0.0"
[dev-dependencies]
exercism_test_runner = "~> 1.9"

View File

@@ -0,0 +1,31 @@
# This file was generated by Gleam
# You typically do not need to edit this file
packages = [
{ name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" },
{ name = "exercism_test_runner", version = "1.9.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 = "0B17BB25F2FF1E60266467C24FE0CA04005410306AA05E9A4B41B1852D72865C" },
{ name = "filepath", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "67A6D15FB39EEB69DD31F8C145BB5A421790581BD6AA14B33D64D5A55DBD6587" },
{ name = "gap", version = "1.1.3", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_stdlib"], otp_app = "gap", source = "hex", outer_checksum = "6EF5E3B523FDFBC317E9EA28D5163EE04744A97C007106F90207569789612291" },
{ name = "glance", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "glexer"], otp_app = "glance", source = "hex", outer_checksum = "E155BA1A787FD11827048355021C0390D2FE9A518485526F631A9D472858CC6D" },
{ name = "gleam_community_ansi", version = "1.4.3", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_regexp", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "8A62AE9CC6EA65BEA630D95016D6C07E4F9973565FA3D0DE68DC4200D8E0DD27" },
{ name = "gleam_community_colour", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "FDD6AC62C6EC8506C005949A4FCEF032038191D5EAAEC3C9A203CD53AE956ACA" },
{ name = "gleam_deque", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_deque", source = "hex", outer_checksum = "64D77068931338CF0D0CB5D37522C3E3CCA7CB7D6C5BACB41648B519CC0133C7" },
{ name = "gleam_erlang", version = "0.34.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "0C38F2A128BAA0CEF17C3000BD2097EB80634E239CE31A86400C4416A5D0FDCC" },
{ name = "gleam_json", version = "2.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "C55C5C2B318533A8072D221C5E06E5A75711C129E420DD1CE463342106012E5D" },
{ name = "gleam_otp", version = "0.16.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "50DA1539FC8E8FA09924EB36A67A2BBB0AD6B27BCDED5A7EF627057CF69D035E" },
{ name = "gleam_regexp", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_regexp", source = "hex", outer_checksum = "7F5E0C0BBEB3C58E57C9CB05FA9002F970C85AD4A63BA1E55CBCB35C15809179" },
{ name = "gleam_stdlib", version = "0.55.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "32D8F4AE03771516950047813A9E359249BD9FBA5C33463FDB7B953D6F8E896B" },
{ name = "gleam_yielder", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_yielder", source = "hex", outer_checksum = "8E4E4ECFA7982859F430C57F549200C7749823C106759F4A19A78AEA6687717A" },
{ name = "glexer", version = "2.2.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glexer", source = "hex", outer_checksum = "5C235CBDF4DA5203AD5EAB1D6D8B456ED8162C5424FE2309CFFB7EF438B7C269" },
{ name = "simplifile", version = "1.7.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "1D5DFA3A2F9319EC85825F6ED88B8E449F381B0D55A62F5E61424E748E7DDEB0" },
]
[requirements]
exercism_test_runner = { version = "~> 1.9" }
gleam_deque = { version = ">= 1.0.0 and < 2.0.0" }
gleam_erlang = { version = ">= 0.25.0 and < 1.0.0" }
gleam_otp = { version = "~> 0.7 or ~> 1.0" }
gleam_regexp = { version = ">= 1.1.0 and < 2.0.0" }
gleam_stdlib = { version = ">= 0.54.0 or ~> 1.0" }
gleam_yielder = { version = ">= 1.1.0 and < 2.0.0" }
simplifile = { version = "~> 1.0" }

View File

@@ -0,0 +1,21 @@
pub type TreasureChest(a) {
TreasureChest(String, a)
}
pub type UnlockResult(a) {
Unlocked(a)
WrongPassword
}
pub fn get_treasure(
chest: TreasureChest(treasure),
password: String,
) -> UnlockResult(treasure) {
case chest {
TreasureChest(pass, a) ->
case pass == password {
False -> WrongPassword
True -> Unlocked(a)
}
}
}

View File

@@ -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)
}