/
atom.gleam
79 lines (73 loc) 路 2.56 KB
/
atom.gleam
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import gleam/dynamic.{DecodeError, Dynamic}
/// Atom is a special string-like data-type that is most commonly used for
/// interfacing with code written in other BEAM languages such as Erlang and
/// Elixir. It is preferable to define your own custom types to use instead of
/// atoms where possible.
///
/// Atoms are not used much in typical Gleam code!
///
/// ## Creating atoms
///
/// We can create atoms with the the [`create_from_string`](#create_from_string)
/// function, though we must be careful when doing so as atoms are never
/// garbage collected. If we create too many atoms (for example, if we convert
/// user input into atoms) we may hit the max limit of atoms and cause the
/// virtual machine to crash.
///
pub external type Atom
/// An error returned when no atom is found in the virtual machine's atom table
/// for a given string when calling the [`from_string`](#from_string) function.
pub type FromStringError {
AtomNotLoaded
}
/// Finds an existing Atom for the given String.
///
/// If no atom is found in the virtual machine's atom table for the String then
/// an error is returned.
///
/// ## Examples
///
/// > from_string("ok")
/// Ok(create_from_string("ok"))
///
/// > from_string("some_new_atom")
/// Error(AtomNotLoaded)
///
pub external fn from_string(String) -> Result(Atom, FromStringError) =
"gleam_erlang_ffi" "atom_from_string"
/// Creates an atom from a string, inserting a new value into the virtual
/// machine's atom table if an atom does not already exist for the given
/// string.
///
/// We must be careful when using this function as there is a limit to the
/// number of atom that can fit in the virtual machine's atom table. Never
/// convert user input into atoms as filling the atom table will cause the
/// virtual machine to crash!
///
pub external fn create_from_string(String) -> Atom =
"gleam_erlang_ffi" "atom_create_from_string"
/// Retuns a `String` corresponding to the text representation of the given
/// `Atom`.
///
/// ## Examples
///
/// > let ok_atom = create_from_string("ok")
/// > to_string(ok_atom)
/// "ok"
///
pub external fn to_string(Atom) -> String =
"gleam_erlang_ffi" "atom_to_string"
/// Checks to see whether a Dynamic value is an atom, and return the atom if
/// it is.
///
/// ## Examples
///
/// > import gleam/atom
/// > atom(from(atom.create_from_string("hello")))
/// OK("hello")
///
/// > atom(from(123))
/// Error(DecodeError(expected: "Int", found: "Int"))
///
pub external fn from_dynamic(from: Dynamic) -> Result(Atom, DecodeError) =
"gleam_erlang_ffi" "atom_from_dynamic"