···11-# playground
22-33-[](https://hex.pm/packages/playground)
44-[](https://hexdocs.pm/playground/)
55-66-## Quick start
77-88-```sh
99-gleam run # Run the project
1010-gleam test # Run the tests
1111-gleam shell # Run an Erlang shell
1212-```
1313-1414-## Installation
1515-1616-If available on Hex this package can be added to your Gleam project:
1717-1818-```sh
1919-gleam add playground
2020-```
2121-2222-and its documentation can be found at <https://hexdocs.pm/playground>.
-20
try-gleam/gleam.toml
···11-name = "try_gleam"
22-version = "1.0.0"
33-target = "javascript"
44-55-# Fill out these fields if you intend to generate HTML documentation or publish
66-# your project to the Hex package manager.
77-#
88-# description = ""
99-# licences = ["Apache-2.0"]
1010-# repository = { type = "github", user = "username", repo = "project" }
1111-# links = [{ title = "Website", href = "https://gleam.run" }]
1212-1313-[dependencies]
1414-gleam_stdlib = "~> 0.32"
1515-simplifile = "~> 1.0"
1616-snag = "~> 0.2"
1717-htmb = "~> 1.1"
1818-1919-[dev-dependencies]
2020-gleeunit = "~> 1.0"
-22
try-gleam/lessons/README.md
···11-# lessons
22-33-[](https://hex.pm/packages/lessons)
44-[](https://hexdocs.pm/lessons/)
55-66-## Quick start
77-88-```sh
99-gleam run # Run the project
1010-gleam test # Run the tests
1111-gleam shell # Run an Erlang shell
1212-```
1313-1414-## Installation
1515-1616-If available on Hex this package can be added to your Gleam project:
1717-1818-```sh
1919-gleam add lessons
2020-```
2121-2222-and its documentation can be found at <https://hexdocs.pm/lessons>.
···11-<h2>Hello, friend 💫</h2>
22-<p>
33- Welcome to Try Gleam! An interactive tour of the Gleam programming language.
44-</p>
55-<p>
66- It covers all aspects of the Gleam language, and assuming you have some
77- prior programming experience should teach you everything you need to write
88- real programs in Gleam.
99-</p>
1010-<p>
1111- The tour is interactive! The code shown is editable and will be compiled and
1212- evaluated as you type. Anything you print using <code>io.println</code> or
1313- <code>io.debug</code> will be shown in the bottom section, along with any
1414- compile errors and warnings. To evaluate Gleam code the tour compiles Gleam to
1515- JavaScript and runs it, all entirely within your browser window.
1616-</p>
1717-<p>
1818- If at any point you get stuck or have a question do not hesitate to ask in
1919- <a href="https://discord.gg/Fm8Pwmy">the Gleam Discord server</a>. We're here
2020- to help, and if you find something confusing then it's likely others will too,
2121- and we want to know about it so we can improve the tour.
2222-</p>
2323-<p>
2424- OK, let's go. Click "Next" to get started, or click "Index" to jump to a
2525- specific topic.
2626-</p>
-7
try-gleam/lessons/src/lesson001_basics/code.gleam
···11-// Import a Gleam module from the standard library
22-import gleam/io
33-44-pub fn main() {
55- // Print to the console
66- io.println("Hello, Joe!")
77-}
-17
try-gleam/lessons/src/lesson001_basics/text.html
···11-<p>
22- Here is a program that prints out the text "Hello, Joe!".
33-</p>
44-<p>
55- It does this by using the `println` function which has been imported from the
66- <a href="https://hexdocs.pm/gleam_stdlib/gleam/io.html"><code>gleam/io</code></a>
77- module, which is part of the Gleam standard library.
88-</p>
99-<p>
1010- In a normal Gleam program this program would be run use the command
1111- <code>gleam run</code> on the command line, but here in this tutorial the
1212- program is automatically compiled and run as the code is edited.
1313-</p>
1414-<p>
1515- Try changing the text being printed to <code>Hello, Mike!</code> and see what
1616- happens.
1717-</p>
···11-// Import the module and one of its functions
22-import gleam/io.{println}
33-44-pub fn main() {
55- // Use the function in a qualified fashion
66- io.println("This is qualified")
77-88- // Or an unqualified fashion
99- println("This is unqualified")
1010-}
···11-<p>
22- Normally functions from other modules are used in a qualified fashion, with
33- the module qualifier before function name. For example,
44- <code>io.println("Hello!")</code>.
55-</p>
66-<p>
77- It is also possible to specify a list of functions to import from a module in
88- an unqualified fashion, such as the <code>println</code> function in the code
99- editor. Because it has been imported like this it can be referred to as just
1010- <code>println</code>.
1111-</p>
1212-<p>
1313- Generally it is best to use qualified imports, as this makes it clear where
1414- the function is defined, making the code easier to read.
1515-</p>
···11-<p>
22- Gleam has a robust static type system that is help you as you write and edit
33- code, catching mistakes and showing you where to make changes.
44-</p>
55-<p>
66- Uncomment the line <code>io.println(4)</code> and see how a compile time error
77- is reported as the <code>io.println</code> function only works with strings,
88- not ints.
99-</p>
1010-<p>
1111- To fix the code change the code to call the <code>io.debug</code>
1212- function instead, as it will print a value of any type.
1313-</p>
1414-<p>
1515- Gleam has no <code>null</code>, no implicit conversions, no exceptions, and
1616- always performs full type checking. If the code compiles you can be reasonably
1717- confident it does not have any inconsistencies that may cause bugs or
1818- crashes.
1919-</p>
···11-<p>
22- Gleam's <code>Int</code> type represents whole numbers.
33-</p>
44-<p>
55- There are arithmetic and comparison operators for ints.
66-</p>
77-<p>
88- When running on the Erlang virtual machine ints have no maximum and minimum
99- size. When running on JavaScript runtimes ints are represented using
1010- JavaScript's 64 bit floating point numbers,
1111-</p>
1212-<p>
1313- The <a href="https://hexdocs.pm/gleam_stdlib/gleam/int.html"><code>gleam/int</code></a>
1414- standard library module contains functions for working with ints.
1515-</p>
···11-<p>
22- Gleam's <code>Float</code> type represents numbers that are not integers.
33-</p>
44-<p>
55- Unlike many languages Gleam does not have a `NaN` or `Infinity` float value.
66-</p>
77-<p>
88- Gleam's numerical operators are not overloaded, so there are dedictated
99- operators for working with floats.
1010-</p>
1111-<p>
1212- Floats are represented as 64 bit floating point numbers on both Erlang and
1313- JavaScript runtimes.
1414-</p>
1515-<p>
1616- The <a href="https://hexdocs.pm/gleam_stdlib/gleam/float.html"><code>gleam/float</code></a>
1717- standard library module contains functions for working with floats.
1818-</p>
1919-
···11-<p>
22- Underscores can be added to numbers for clarity. For example,
33- <code>1000000</code> can be tricky to read quickly, while
44- <code>1_000_000</code> can be easier.
55-</p>
66-<p>
77- Ints can be written in binary, octal, or hexadecimal formats using the
88- <code>0b</code>, <code>0o</code>, and <code>0x</code> prefixes respectively.
99-</p>
1010-<p>
1111- Floats can be written in a scientific notation.
1212-</p>
1313-
···11-<p>
22- In Gleam Strings are written as text surrounded by double quotes, and
33- can span multiple lines and contain unicode characters.
44-</p>
55-<p>
66- The <code><></code> operator can be used to concatenate strings.
77-</p>
88-<p>
99- Several escape sequences are supported:
1010-</p>
1111-<ul>
1212- <li><code>\"</code> - double quote</li>
1313- <li><code>\\</code> - backslash</li>
1414- <li><code>\f</code> - form feed</li>
1515- <li><code>\n</code> - newline</li>
1616- <li><code>\r</code> - carriage return</li>
1717- <li><code>\t</code> - tab</li>
1818- <li><code>\u{xxxxxx}</code> - unicode codepoint</li>
1919-</ul>
2020-<p>
2121- The <a href="https://hexdocs.pm/gleam_stdlib/gleam/string.html"><code>gleam/string</code></a>
2222- standard library module contains functions for working with strings.
2323-</p>
···11-<p>
22- A <code>Bool</code> is a either <code>True</code> or <code>False</code>.
33-</p>
44-<p>
55- The <code>||</code>, <code>&&</code>, and <code>!</code> operators can be used
66- to manipulate bools.
77-</p>
88-<p>
99- The <code>||</code> and <code>&&</code> operators are short-circuiting,
1010- meaning that if the left hand side of the operator is <code>True</code> for
1111- <code>||</code> or <code>False</code> for <code>&&</code> then the right hand
1212- side of the operator will not be evaluated.
1313-</p>
1414-<p>
1515- The <a href="https://hexdocs.pm/gleam_stdlib/gleam/bool.html"><code>gleam/bool</code></a>
1616- standard library module contains functions for working with bools.
1717-</p>
···11-import gleam/io
22-33-pub fn main() {
44- let x = "Original"
55- io.debug(x)
66-77- // Assign `y` to the value of `x`
88- let y = x
99- io.debug(y)
1010-1111- // Assign `x` to a new value
1212- let x = "New"
1313- io.debug(x)
1414-1515- // The `y` still refers to the original value
1616- io.debug(y)
1717-}
···11-<p>
22- A value can be assigned to a variable using <code>let</code>.
33-</p>
44-<p>
55- Variable names can be reused by later let bindings, but the values they
66- reference are immutable, so the values themselves are not changed or mutated
77- in any way.
88-</p>
···11-<p>
22- If a variable is assigned but not used then Gleam will emit a warning.
33-</p>
44-<p>
55- If a variable is intended not to be use then the name can be prefixed with an
66- underscore, silencing the warning.
77-</p>
88-<p>
99- Try changing the variable name to <code>score</code> to see the warning.
1010-</p>
···11-<p>
22- Let assignments can be written with a type annotation after the name.
33-</p>
44-<p>
55- Type annotations may be useful for documentation purposes, but they do not
66- change how Gleam type checks the code beyond ensuring that the annotation is
77- correct.
88-</p>
99-<p>
1010- Typically Gleam code will not have type annotations for assignments.
1111-</p>
1212-<p>
1313- Try changing a type annotation to something incorrect to see the compile
1414- error.
1515-</p>
-13
try-gleam/lessons/src/lesson012_blocks/code.gleam
···11-import gleam/io
22-33-pub fn main() {
44- let fahrenheit = {
55- let degrees = 64
66- degrees
77- }
88- // io.debug(degrees) // <- This will not compile
99-1010- // Changing order of evaluation
1111- let celsius = { fahrenheit - 32 } * 5 / 9
1212- io.debug(celsius)
1313-}
-23
try-gleam/lessons/src/lesson012_blocks/text.html
···11-<p>
22- Blocks are one or more expressions grouped together with curly braces. Each
33- expression is evaluated in order and the value of the last expression is
44- returned.
55-</p>
66-<p>
77- Any variables assigned within the block can only be used within the block.
88-</p>
99-<p>
1010- Try uncommenting <code>io.debug(degrees)</code> to see the compile error from
1111- trying to use a variable that is not in scope.
1212-</p>
1313-<p>
1414- Blocks can also be used to change the order of evaluation of binary operators
1515- expressions.
1616-</p>
1717-<p>
1818- <code>*</code> binds more tightly than <code>+</code> so the expression
1919- <code>1 + 2 * 3</code> evaluates to 7. If the <code>1 + 2</code> should be
2020- evaluated first to make the expression evaluate to 9 then the expression can be
2121- wrapped in a block: <code>{ 1 + 2 } * 3</code>. This is similar to grouping
2222- with parentheses in some other languages.
2323-</p>
···11-<p>
22- The <code>fn</code> keyword is used to define new functions.
33-</p>
44-<p>
55- The <code>double</code> and <code>multiply</code> functions are defined
66- without the <code>pub</code> keyword. This makes them <em>private</em>
77- functions, they can only be used within this module. If another module
88- attempted to use them it would result in a compiler error.
99-</p>
1010-<p>
1111- Like with assignments, type annotations are optional for function arguments
1212- and return values. It is considered good practice to use type annotations for
1313- functions, for clarity and to encourage intentional and thoughtful design.
1414-</p>
···11-import gleam/io
22-33-pub fn main() {
44- // Call a function with another function
55- io.debug(twice(1, add_one))
66-77- // Functions can be assigned to variables
88- let function = add_one
99- io.debug(function(100))
1010-}
1111-1212-fn twice(argument: Int, function: fn(Int) -> Int) -> Int {
1313- function(function(argument))
1414-}
1515-1616-fn add_one(argument: Int) -> Int {
1717- argument + 1
1818-}
···11-<p>
22- In Gleam functions are values. They can be assigned to variables, passed to
33- other functions, and anything else you can do with values.
44-</p>
55-<p>
66- Here the function <code>add_one</code> is being passed as an argument to the
77- <code>twice</code> function.
88-</p>
99-<p>
1010- Notice the <code>fn</code> keyword is also used to describe the type of the
1111- function that <code>twice</code> takes as its second argument.
1212-</p>
···11-import gleam/io
22-33-pub fn main() {
44- // Assign an anonymous function to a variable
55- let add_one = fn(a) { a + 1 }
66- io.debug(twice(1, add_one))
77-88- // Pass an anonymous function as an argument
99- io.debug(twice(1, fn(a) { a * 2 }))
1010-}
1111-1212-fn twice(argument: Int, function: fn(Int) -> Int) -> Int {
1313- function(function(argument))
1414-}
···11-<p>
22- As well as module-level named functions, Gleam has anonymous function
33- literals.
44-</p>
55-<p>
66- Anonymous functions can be used interchangeably with named functions.
77-</p>
···11-<p>
22- Gleam has a shorthand syntax for creating anonymous functions that take one
33- argument and immediately call another function with that argument: the
44- function capture syntax.
55-</p>
66-<p>
77- The anonymous function <code>fn(a) { some_function(..., a, ...) }</code> can
88- be written as <code>some_function(..., _, ...)</code>, with any number of
99- other arguments passed to the inner function. The underscore <code>_</code> is
1010- a placeholder for the final argument.
1111-</p>
···11-import gleam/io
22-33-pub fn main() {
44- let add_one = fn(x) { x + 1 }
55- let exclaim = fn(x) { x <> "!" }
66-77- // Invalid, Int and String are not the same type
88- // twice(10, exclaim)
99-1010- // Here the type variable is replaced by the type Int
1111- io.debug(twice(10, add_one))
1212-1313- // Here the type variable is replaced by the type String
1414- io.debug(twice("Hello", exclaim))
1515-}
1616-1717-fn twice(argument: value, function: fn(value) -> value) -> value {
1818- function(function(argument))
1919-}
···11-<p>
22- Up until now each function has accepted precisely one type for each of its
33- arguments.
44-</p>
55-<p>
66- The <code>twice</code> function for example only worked with functions that
77- would take and return ints. This is overly restrictive, it should be possible
88- to use this function with any type, so long as the function and the initial
99- value are compatible.
1010-</p>
1111-<p>
1212- To enable this Gleam support <em>generics</em>, also known as <em>parametric
1313- polymorphism</em>.
1414-</p>
1515-<p>
1616- This works by instead of specifying a concrete type, a type variable is used
1717- which stands in for whatever specific type is being used when the function is
1818- called. These type variable are written with a lowercase name.
1919-</p>
2020-<p>
2121- Type variables are not like an <code>any</code> type, they get replaced with a
2222- specific type each time the function is called. Try uncommenting
2323- <code>twice(10, exclaim)</code> to see the compiler error from trying to use a
2424- type variable as an int and a string at the same time.
2525-</p>
···11-<p>
22- It's common to want to call a series of functions, passing the result of one
33- to the next. With the regular function call syntax this can be a little
44- difficult to read as you have to read the code from the inside out.
55-</p>
66-<p>
77- Gleam's pipe operator <code>|></code> helps with this problem by allowing you
88- to write code top-to-bottom.
99-</p>
1010-<p>
1111- The pipe operator takes the result of the expression on its left and passes it
1212- as an argument to the function on its right.
1313-</p>
1414-<p>
1515- It will first check to see if the left-hand value could be used as the first
1616- argument to the call. For example, <code>a |> b(1, 2)</code> would become
1717- <code>b(a, 1, 2)</code>. If not, it falls back to calling the result of the
1818- right-hand side as a function, e.g., <code>b(1, 2)(a)</code>
1919-</p>
2020-<p>
2121- Gleam code is typically written with the "subject" of the function as the
2222- first argument, to make it easier to pipe. If you wish to pipe to a different
2323- position then a function capture can be used to insert the argument to the
2424- desired position.
2525-</p>
···11-<p>
22- When functions take several arguments it can be difficult to remember what the
33- arguments are, and what order they are expected in.
44-</p>
55-<p>
66- To help with this Gleam supports labelled arguments, where function arguments
77- are given an external label in addition to their internal name. These labels
88- are written before the argument name in the function definition.
99-</p>
1010-<p>
1111- When labelled arguments are used the order of the arguments does not matter,
1212- but all unlabelled arguments must come before labelled arguments.
1313-</p>
1414-<p>
1515- There is no performance cost to using labelled arguments, it does not allocate
1616- a dictionary or perform any other runtime work.
1717-</p>
1818-<p>
1919- Labels are optional when calling a function, it is up to the programmer to
2020- decide what is clearest in their code.
2121-</p>
2222-2323-
-16
try-gleam/lessons/src/lesson020_lists/code.gleam
···11-import gleam/io
22-33-pub fn main() {
44- let ints = [1, 2, 3]
55-66- io.debug(ints)
77-88- // Immutably prepend
99- io.debug([-1, 0, ..ints])
1010-1111- // Uncomment this to see the error
1212- // io.debug(["zero", ..ints])
1313-1414- // The original lists are unchanged
1515- io.debug(ints)
1616-}
-19
try-gleam/lessons/src/lesson020_lists/text.html
···11-<p>
22- Lists are ordered collections of values.
33-</p>
44-<p>
55- <code>List</code> is a generic type, having a type parameter
66- for the type of values it contains. A list of ints has the type
77- <code>List(Int)</code>, and a list of strings has the type
88- <code>List(String)</code>.
99-</p>
1010-<p>
1111- Lists are immutable single-linked lists, meaning they are very efficient to
1212- add and remove elements from the front of the list.
1313-</p>
1414-<p>
1515- Counting the length of a list or getting elements from other positions in the
1616- list is expensive and rarely done. It is rare to write algorithms that index
1717- into sequences in Gleam, but but when they are written a list is not the right
1818- choice of data structure.
1919-</p>
···11-<p>
22- The <a href="https://hexdocs.pm/gleam_stdlib/gleam/list.html"><code>gleam/list</code></a>
33- standard library module contains functions for working with lists. A Gleam
44- program will likely make heavy use of this module.
55-</p>
66-77-<p>
88- <a href="https://hexdocs.pm/gleam_stdlib/gleam/list.html#map"><code>map</code></a>
99- makes a new list by running a function on each element in a list.
1010-</p>
1111-<p>
1212- <a href="https://hexdocs.pm/gleam_stdlib/gleam/list.html#filter"><code>filter</code></a>
1313- makes a new list containing only the elements for which a function returns
1414- true.
1515-</p>
1616-<p>
1717- <a href="https://hexdocs.pm/gleam_stdlib/gleam/list.html#fold"><code>fold</code></a>
1818- combines all the elements in a list into a single value by running a function
1919- left-to-right on each element, passing the result of the previous call to the
2020- next call.
2121-</p>
2222-<p>
2323- It's worth getting familiar with all the functions in this module when writing
2424- Gleam code.
2525-</p>
···11-<p>
22- Patterns in case expressions can also assign variables.
33-</p>
44-<p>
55- When a variable name is used in a pattern the value that is matched against is
66- assigned to that name, and can be used in the body of that clause.
77-</p>
···11-import gleam/io
22-import gleam/int
33-44-pub fn main() {
55- let x = int.random(0, 5)
66- io.debug(x)
77-88- let result = case x {
99- // Match specific values
1010- 0 -> "Zero"
1111- 1 -> "One"
1212- // Match any other value
1313- _ -> "Other"
1414- }
1515- io.debug(result)
1616-}
···11-<p>
22- The case expression is the most common kind of flow control in Gleam code. It
33- is similar to `switch` in some other languages, but more powerful than most.
44-</p>
55-<p>
66- It allows the programmer to say "if the data has this shape then run this
77- code", a process called called <em>pattern matching</em>.
88-</p>
99-<p>
1010- Gleam performs <em>exhaustiveness checking</em> to ensure that the patterns in
1111- a case expression cover all possible values. With this you can have confidence
1212- that your logic is up-to-date for the design of the data you are working with.
1313-</p>
1414-<p>
1515- Try commenting out patterns or adding new redundant ones, and see what
1616- problems the compiler reports.
1717-</p>
···11-<p>
22- When pattern matching on strings the <code><></code> operator can be
33- used to match on strings with a specific prefix.
44-</p>
55-<p>
66- The pattern <code>"hello " <> name</code> matches any string that starts with
77- <code>"hello "</code> and asigns the rest of the string to the variable
88- <code>name</code>.
99-</p>
···11-<p>
22- Lists and the values they contain can be pattern matched on in case
33- expressions.
44-</p>
55-<p>
66- List patterns match on specific lengths of lists. The pattern <code>[]</code>
77- matches an empty list, and the pattern <code>[_]</code> matches a list with
88- one element. They will not match on lists with other lengths.
99-</p>
1010-<p>
1111- The spread pattern <code>..</code> can be used to match the rest of the list.
1212- The pattern <code>[1, ..]</code> matches any list that starts with
1313- <code>1</code>. The pattern <code>[_, _, ..]</code> matches any list that has
1414- at least two elements.
1515-</p>
···11-<p>
22- Most commonly functions in the
33- <a href="https://hexdocs.pm/gleam_stdlib/gleam/list.html"><code>gleam/list</code></a>
44- module are used to iterate across a list, but at times you may prefer
55- to work with the list directly.
66-</p>
77-<p>
88- Gleam doesn't have a looping syntax, instead iteration is done through
99- recursion and pattern matching.
1010-</p>
1111-<p>
1212- The <code>[first, ..rest]</code> pattern matches on a list with at least one
1313- element, assigning the first element to the variable <code>first</code> and
1414- the rest of the list to the variable <code>rest</code>.
1515- By using this pattern and a pattern for the empty list <code>[]</code> a
1616- function can run code on each element of a list until the end is reached.
1717-</p>
1818-<p>
1919- This code sums a list by recursing over the list and adding each int to a
2020- <code>total</code> argument, returning it when the end is reached.
2121-</p>
2222-
···11-//// A module containing some unusual functions and types.
22-33-/// A type where the value can never be constructed.
44-/// Can you work out why?
55-pub type Never {
66- Never(Never)
77-}
88-99-/// Call a function twice with an initial value.
1010-///
1111-pub fn twice(argument: value, function: fn(value) -> value) -> value {
1212- function(function(argument))
1313-}
1414-1515-/// Call a function three times with an initial value.
1616-///
1717-pub fn thrice(argument: value, function: fn(value) -> value) -> value {
1818- function(function(function(argument)))
1919-}
···11-<p>
22- Documentation and comments are important tools for making your code easier to
33- work with and understand.
44-</p>
55-<p>
66- As well as regular <code>//</code> comments Gleam has <code>///</code> and
77- <code>////</code> comments which are used for attaching documentation to code.
88-</p>
99-<p>
1010- <code>///</code> is used for documenting types and functions, and should be
1111- placed immediately before the type or function it is documenting.
1212-</p>
1313-<p>
1414- <code>////</code> is used for documenting modules, and should be placed
1515- at the top of the module.
1616-</p>
-12
try-gleam/lessons/test/lessons_test.gleam
···11-import gleeunit
22-import gleeunit/should
33-44-pub fn main() {
55- gleeunit.main()
66-}
77-88-// gleeunit test functions end in `_test`
99-pub fn hello_world_test() {
1010- 1
1111- |> should.equal(1)
1212-}
-17
try-gleam/manifest.toml
···11-# This file was generated by Gleam
22-# You typically do not need to edit this file
33-44-packages = [
55- { name = "gleam_stdlib", version = "0.33.1", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "3CEAD7B153D896499C78390B22CC968620C27500C922AED3A5DD7B536F922B25" },
66- { name = "gleeunit", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "D3682ED8C5F9CAE1C928F2506DE91625588CC752495988CBE0F5653A42A6F334" },
77- { name = "htmb", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "htmb", source = "hex", outer_checksum = "30D448F0E15DFCF7283AAAC2F351D77B9D54E318219C9FDDB1877572B67C27B7" },
88- { name = "simplifile", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "0BD6F0E7DA1A7E11D18B8AD48453225CAFCA4C8CFB4513D217B372D2866C501C" },
99- { name = "snag", version = "0.2.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "8FD70D8FB3728E08AC425283BB509BB0F012BE1AE218424A597CDE001B0EE589" },
1010-]
1111-1212-[requirements]
1313-gleam_stdlib = { version = "~> 0.32" }
1414-gleeunit = { version = "~> 1.0" }
1515-htmb = { version = "~> 1.1" }
1616-simplifile = { version = "~> 1.0" }
1717-snag = { version = "~> 0.2" }