Skip to content

Commit

Permalink
[gleam] complete treasure-chest
Browse files Browse the repository at this point in the history
  • Loading branch information
joaofnds committed Apr 3, 2024
1 parent 7bd67ad commit 9a9bd7e
Show file tree
Hide file tree
Showing 8 changed files with 225 additions and 0 deletions.
4 changes: 4 additions & 0 deletions gleam/treasure-chest/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
*.beam
*.ez
build
erl_crash.dump
32 changes: 32 additions & 0 deletions gleam/treasure-chest/HELP.md
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.
13 changes: 13 additions & 0 deletions gleam/treasure-chest/HINTS.md
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.
94 changes: 94 additions & 0 deletions gleam/treasure-chest/README.md
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
11 changes: 11 additions & 0 deletions gleam/treasure-chest/gleam.toml
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"
26 changes: 26 additions & 0 deletions gleam/treasure-chest/manifest.toml
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" }
18 changes: 18 additions & 0 deletions gleam/treasure-chest/src/treasure_chest.gleam
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
}
}
27 changes: 27 additions & 0 deletions gleam/treasure-chest/test/treasure_chest_test.gleam
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)
}

0 comments on commit 9a9bd7e

Please sign in to comment.