@@ -2,24 +2,24 @@ import gleam/map.{Map}
2
2
import gleam/result
3
3
import gleam/list
4
4
5
- /// A set is a collection of unique elements of the same type.
5
+ /// A set is a collection of unique members of the same type.
6
6
///
7
7
/// It is implemented using the `gleam/map` module, so inserts and lookups have
8
8
/// logarithmic time complexity.
9
9
///
10
- pub opaque type Set ( element ) {
10
+ pub opaque type Set ( member ) {
11
11
// A list is used as the map value as an empty list has the smallest
12
12
// representation in Erlang's binary format
13
- Set ( map : Map ( element , List ( Nil ) ) )
13
+ Set ( map : Map ( member , List ( Nil ) ) )
14
14
}
15
15
16
16
/// Create a new empty set.
17
17
///
18
- pub fn new ( ) -> Set ( element ) {
18
+ pub fn new ( ) -> Set ( member ) {
19
19
Set ( map . new ( ) )
20
20
}
21
21
22
- /// Get the number of elements in a set.
22
+ /// Get the number of members in a set.
23
23
///
24
24
/// This function runs in constant time.
25
25
///
@@ -28,11 +28,11 @@ pub fn new() -> Set(element) {
28
28
/// > new() |> insert(1) |> insert(2) |> size
29
29
/// 2
30
30
///
31
- pub fn size ( set : Set ( element ) ) -> Int {
31
+ pub fn size ( set : Set ( member ) ) -> Int {
32
32
map . size ( set . map )
33
33
}
34
34
35
- /// Insert an element into the set.
35
+ /// Insert an member into the set.
36
36
///
37
37
/// This function runs in logarithmic time.
38
38
///
@@ -41,11 +41,11 @@ pub fn size(set: Set(element)) -> Int {
41
41
/// > new() |> insert(1) |> insert(2) |> size
42
42
/// 2
43
43
///
44
- pub fn insert ( into set : Set ( element ) , this element : element ) -> Set ( element ) {
45
- Set ( map : map . insert ( set . map , element , [ ] ) )
44
+ pub fn insert ( into set : Set ( member ) , this member : member ) -> Set ( member ) {
45
+ Set ( map : map . insert ( set . map , member , [ ] ) )
46
46
}
47
47
48
- /// Check whether a set contains a given element .
48
+ /// Check whether a set contains a given member .
49
49
///
50
50
/// This function runs in logarithmic time.
51
51
///
@@ -57,13 +57,13 @@ pub fn insert(into set: Set(element), this element: element) -> Set(element) {
57
57
/// > new() |> insert(2) |> contains(1)
58
58
/// False
59
59
///
60
- pub fn contains ( in set : Set ( element ) , this member : element ) -> Bool {
60
+ pub fn contains ( in set : Set ( member ) , this member : member ) -> Bool {
61
61
set . map
62
62
|> map . get ( member )
63
63
|> result . is_ok
64
64
}
65
65
66
- /// Remove an element from a set. If the set does not contain the element then
66
+ /// Remove an member from a set. If the set does not contain the member then
67
67
/// the set is returned unchanged.
68
68
///
69
69
/// This function runs in logarithmic time.
@@ -73,11 +73,11 @@ pub fn contains(in set: Set(element), this member: element) -> Bool {
73
73
/// > new() |> insert(2) |> delete(2) |> contains(1)
74
74
/// False
75
75
///
76
- pub fn delete ( from set : Set ( element ) , this member : element ) -> Set ( element ) {
76
+ pub fn delete ( from set : Set ( member ) , this member : member ) -> Set ( member ) {
77
77
Set ( map : map . delete ( set . map , member ) )
78
78
}
79
79
80
- /// Convert the set into a list of the contained elements .
80
+ /// Convert the set into a list of the contained members .
81
81
///
82
82
/// The list has no specific ordering, any unintentional ordering may change in
83
83
/// future versions of Gleam or Erlang.
@@ -89,11 +89,11 @@ pub fn delete(from set: Set(element), this member: element) -> Set(element) {
89
89
/// > new() |> insert(2) |> to_list
90
90
/// [2]
91
91
///
92
- pub fn to_list ( set : Set ( element ) ) -> List ( element ) {
92
+ pub fn to_list ( set : Set ( member ) ) -> List ( member ) {
93
93
map . keys ( set . map )
94
94
}
95
95
96
- /// Create a new set of the elements in a given list.
96
+ /// Create a new set of the members in a given list.
97
97
///
98
98
/// This function runs in loglinear time.
99
99
///
@@ -103,11 +103,32 @@ pub fn to_list(set: Set(element)) -> List(element) {
103
103
/// > [1, 1, 2, 4, 3, 2] |> from_list |> to_list |> list.sort
104
104
/// [1, 3, 3, 4]
105
105
///
106
- pub fn from_list ( elements : List ( element ) ) -> Set ( element ) {
106
+ pub fn from_list ( members : List ( member ) ) -> Set ( member ) {
107
107
let map = list . fold (
108
- over : elements ,
108
+ over : members ,
109
109
from : map . new ( ) ,
110
110
with : fn ( k , m ) { map . insert ( m , k , [ ] ) } ,
111
111
)
112
112
Set ( map )
113
113
}
114
+
115
+ /// Combine all entries into a single value by calling a given function on each
116
+ /// one.
117
+ ///
118
+ /// Sets are not ordered so the values are not returned in any specific order.
119
+ /// Do not write code that relies on the order entries are used by this
120
+ /// function as it may change in later versions of Gleam or Erlang.
121
+ ///
122
+ /// # Examples
123
+ ///
124
+ /// > from_list([1, 3, 9])
125
+ /// > |> fold(0, fn(member, accumulator) { accumulator + member })
126
+ /// 13
127
+ ///
128
+ pub fn fold (
129
+ over set : Set ( member) ,
130
+ from initial : acc,
131
+ with reducer : fn ( member, acc) -> acc,
132
+ ) -> acc {
133
+ map . fold ( over : set . map , from : initial , with : fn ( k , _ , a ) { reducer ( k , a ) } )
134
+ }
0 commit comments