diff --git a/gleam/spring-cleaning/.gitignore b/gleam/spring-cleaning/.gitignore new file mode 100644 index 0000000..170cca9 --- /dev/null +++ b/gleam/spring-cleaning/.gitignore @@ -0,0 +1,4 @@ +*.beam +*.ez +build +erl_crash.dump diff --git a/gleam/spring-cleaning/HELP.md b/gleam/spring-cleaning/HELP.md new file mode 100644 index 0000000..6c5e617 --- /dev/null +++ b/gleam/spring-cleaning/HELP.md @@ -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/spring_cleaning.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. \ No newline at end of file diff --git a/gleam/spring-cleaning/HINTS.md b/gleam/spring-cleaning/HINTS.md new file mode 100644 index 0000000..ee48e82 --- /dev/null +++ b/gleam/spring-cleaning/HINTS.md @@ -0,0 +1,16 @@ +# Hints + +## 1. Extract errors + +- Errors can be pattern matched on using the `Error(value)` pattern syntax. + +## 2. Remove team prefix + +- String prefixes can be match on using the `"prefix" <> rest` pattern syntax. + +## 3. Split region and team + +- Strings can be split on a character using the [`string.split` function][split]. +- Lists can be match on using the `[a, b, c]` pattern syntax. + +[split]: https://hexdocs.pm/gleam_stdlib/gleam/string.html#split \ No newline at end of file diff --git a/gleam/spring-cleaning/README.md b/gleam/spring-cleaning/README.md new file mode 100644 index 0000000..e8e7a8e --- /dev/null +++ b/gleam/spring-cleaning/README.md @@ -0,0 +1,78 @@ +# Spring Cleaning + +Welcome to Spring Cleaning 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 + +## Let Assertions + +When pattern matching on a value in Gleam we have to ensure the patterns match every possible value of the type, otherwise the code won't compile. + +This function should be rejected as it has not handled case where the list is empty: + +```gleam +pub fn get_first_element_or_crash(items: List(e)) -> e { + case items { + [item, ..] -> item + } +} +``` + +Most of the time in Gleam programs we want to handle every possible case, but in some programs such as prototypes and quick scripts we may want to focus only on the happy path and not write code for other cases. This is where Gleam's `let assert` comes in. + +With let assertions a pattern can match only some of the possible values of a type, and if the pattern does not match a value the program will crash. Using `let assert` we can write the above function like this: + +```gleam +pub fn get_first_element_or_crash(items: List(e)) -> e { + let assert [item, ..] = items + item +} +``` + +Gleam libraries should never use let assertions as they can crash the program. Instead, they should use the `Result` type and let the application developer decide how to handle errors. + +## Instructions + +Mika the events organiser has got a promotion at work, and as part of her new responsibilities she is in charge of the events database. She quickly noticed that a lot of the data is stored in ways that make it hard to work with, so you're teaming up to clean it up with a one-off script. + +Because the script is only going to be run once, and you are confident about the structure of the data, you feel this is a good place to use Gleam's _let assertions_. + +## 1. Extract errors + +Each past event has a list of problems that occurred during the event. These have been stored as results, but they're always the `Error` variant. + + +Implement the `extract_error` function which takes a result that is expected to always be an `Error` and returns the contained error value. + +```gleam +extract_error(Error("Not enough coffee")) +// -> "Not enough coffee" +``` + +## 2. Remove team prefix + +Team names have been prefixed with the word "Team ", but this is not needed. Implement the `remove_team_prefix` function to remove the prefix from a team name. + +```gleam +remove_team_prefix("Team Turtle") +// -> "Turtle" +``` + +## 3. Split region and team + +Each event is run by a team, and each team belongs to a region. In the database they are stored in a single string, separated by a comma. + +Implement the `split_region_and_team` function to split the string into a tuple of two strings, one for the region and one for the team. The prefix "Team " should be removed from the team name. + +```gleam +split_region_and_team("East,Team Orange") +// -> #("East", "Orange") +``` + +## Source + +### Created by + +- @lpil \ No newline at end of file diff --git a/gleam/spring-cleaning/gleam.toml b/gleam/spring-cleaning/gleam.toml new file mode 100644 index 0000000..bafdce2 --- /dev/null +++ b/gleam/spring-cleaning/gleam.toml @@ -0,0 +1,12 @@ +name = "spring_cleaning" +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" diff --git a/gleam/spring-cleaning/manifest.toml b/gleam/spring-cleaning/manifest.toml new file mode 100644 index 0000000..072155d --- /dev/null +++ b/gleam/spring-cleaning/manifest.toml @@ -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" } diff --git a/gleam/spring-cleaning/src/spring_cleaning.gleam b/gleam/spring-cleaning/src/spring_cleaning.gleam new file mode 100644 index 0000000..6196a4c --- /dev/null +++ b/gleam/spring-cleaning/src/spring_cleaning.gleam @@ -0,0 +1,16 @@ +import gleam/string + +pub fn extract_error(problem: Result(a, b)) -> b { + let assert Error(error) = problem + error +} + +pub fn remove_team_prefix(team: String) -> String { + let assert "Team " <> name = team + name +} + +pub fn split_region_and_team(combined: String) -> #(String, String) { + let assert [region, team] = string.split(combined, ",") + #(region, remove_team_prefix(team)) +} diff --git a/gleam/spring-cleaning/test/spring_cleaning_test.gleam b/gleam/spring-cleaning/test/spring_cleaning_test.gleam new file mode 100644 index 0000000..c9ea61e --- /dev/null +++ b/gleam/spring-cleaning/test/spring_cleaning_test.gleam @@ -0,0 +1,43 @@ +import exercism/should +import exercism/test_runner +import spring_cleaning + +pub fn main() { + test_runner.main() +} + +pub fn extract_error_projector_would_not_connect_test() { + Error("Projector would not connect") + |> spring_cleaning.extract_error + |> should.equal("Projector would not connect") +} + +pub fn extract_error_status_code_test() { + Error(114_454) + |> spring_cleaning.extract_error + |> should.equal(114_454) +} + +pub fn remove_team_prefix_team_mega_test() { + "Team Mega" + |> spring_cleaning.remove_team_prefix + |> should.equal("Mega") +} + +pub fn remove_team_prefix_team_sync_test() { + "Team Sync" + |> spring_cleaning.remove_team_prefix + |> should.equal("Sync") +} + +pub fn split_region_and_team_london_four_test() { + "London,Team 4" + |> spring_cleaning.split_region_and_team + |> should.equal(#("London", "4")) +} + +pub fn split_region_and_team_north_devvo_test() { + "North,Team Devvo" + |> spring_cleaning.split_region_and_team + |> should.equal(#("North", "Devvo")) +}