File 0149-Various-documentation-fixes-in-stdlib-modules.patch of Package erlang
From cc9b295be7b2dc787c15fa1906267c3fbf465682 Mon Sep 17 00:00:00 2001
From: Jan Uhlig <juhlig@hnc-agency.org>
Date: Fri, 13 Mar 2026 14:45:16 +0100
Subject: [PATCH] Various documentation fixes in stdlib modules
* gb_sets
* lists
* ordsets
* queue
* sets
---
lib/stdlib/src/gb_sets.erl | 72 ++++++++++++++------------------------
lib/stdlib/src/lists.erl | 6 ++--
lib/stdlib/src/ordsets.erl | 21 ++++++-----
lib/stdlib/src/queue.erl | 30 ++++++++--------
lib/stdlib/src/sets.erl | 9 ++---
5 files changed, 61 insertions(+), 77 deletions(-)
diff --git a/lib/stdlib/src/gb_sets.erl b/lib/stdlib/src/gb_sets.erl
index 42669b3bed..ba201d3aa0 100644
--- a/lib/stdlib/src/gb_sets.erl
+++ b/lib/stdlib/src/gb_sets.erl
@@ -207,9 +207,9 @@ of one set is also a member of the other set; otherwise, returns `false`.
```erlang
1> Empty = gb_sets:new().
2> S = gb_sets:from_list([a,b]).
-3> gb_sets:is_equal(S, S)
+3> gb_sets:is_equal(S, S).
true
-4> gb_sets:is_equal(S, Empty)
+4> gb_sets:is_equal(S, Empty).
false
```
""".
@@ -380,7 +380,7 @@ does not rebalance the tree.
## Examples
```erlang
-1> S0 = gb_sets:from_ordset(lists:seq(1, 100)).
+1> S0 = gb_sets:from_list(lists:seq(1, 100)).
2> Delete = fun(E, Set) -> gb_sets:delete(E, Set) end.
3> S1 = lists:foldl(Delete, S0, lists:seq(1, 50)).
4> gb_sets:size(S1).
@@ -460,7 +460,7 @@ contain duplicates.
## Examples
```erlang
-1> Unordered = [x,y,a,x,y,b,b,z]
+1> Unordered = [x,y,a,x,y,b,b,z].
2> gb_sets:to_list(gb_sets:from_list(Unordered)).
[a,b,x,y,z]
```
@@ -797,10 +797,10 @@ The implementation is very efficient; traversing the whole set using
[`next/1`](`next/1`) is only slightly slower than getting the list of
all elements using `to_list/1` and traversing that. The main advantage
of the iterator approach is that it avoids building the complete list
-of all elements to be built in memory at once.
+of all elements in memory at once.
```erlang
-1> S = gb_sets:from_ordset([1,2,3,4,5]).
+1> S = gb_sets:from_list([1,2,3,4,5]).
2> Iter0 = gb_sets:iterator(S, ordered).
3> element(1, gb_sets:next(Iter0)).
1
@@ -837,25 +837,7 @@ iterator_r({_, _, R} = T, As) ->
iterator_r(nil, As) ->
As.
--doc """
-Returns an iterator that can be used for traversing the entries of `Set`; see
-`next/1`.
-
-Unlike the iterator returned by `iterator/1` or `iterator/2`, this
-iterator starts with the first element greater than or equal to
-`Element`.
-
-Equivalent to [`iterator_from(Element, Set, ordered)`](`iterator_from/3`).
-
-## Examples
-
-```erlang
-1> S = gb_sets:from_ordset([10,20,30,40,50]).
-2> Iter = gb_sets:iterator_from(17, S).
-3> element(1, gb_sets:next(Iter)).
-20
-```
-""".
+-doc(#{equiv => iterator_from(Element, Set, ordered)}).
-doc(#{since => <<"OTP 18.0">>}).
-spec iterator_from(Element, Set) -> Iter when
Set :: set(Element),
@@ -865,19 +847,19 @@ iterator_from(Element, Set) ->
iterator_from(Element, Set, ordered).
-doc """
-Returns an iterator that can be used for traversing the entries of `Set`; see
-`next/1`.
-
-Unlike the iterator returned by `iterator/1` or `iterator/2`, this
-iterator starts with the first element greater than or equal to
-`Element`.
+Returns an iterator over members of `Set` in the given `Order`, starting
+from `Element` or, if absent, the first member that follows in the
+iteration order, if any; see `next/1`.
## Examples
```erlang
-1> S = gb_sets:from_ordset([10,20,30,40,50]).
-2> Iter = gb_sets:iterator_from(17, S, reversed).
-3> element(1, gb_sets:next(Iter)).
+1> S = gb_sets:from_list([10,20,30,40,50]).
+2> Iter1 = gb_sets:iterator_from(17, S, ordered).
+3> element(1, gb_sets:next(Iter1)).
+20
+4> Iter2 = gb_sets:iterator_from(17, S, reversed).
+5> element(1, gb_sets:next(Iter2)).
10
```
""".
@@ -916,7 +898,7 @@ by iterator `Iter1`, and `Iter2` is the new iterator to be used for traversing
the remaining elements, or the atom `none` if no elements remain.
```erlang
-1> S = gb_sets:from_ordset([1,2,3,4,5]).
+1> S = gb_sets:from_list([1,2,3,4,5]).
2> Iter0 = gb_sets:iterator(S).
3> {Element0, Iter1} = gb_sets:next(Iter0).
4> Element0.
@@ -955,8 +937,8 @@ next({_, []}) ->
%% If the sets are not very different in size, i.e., if |Y| / |X| >= c *
%% log(|Y|), then the fastest way to do union (and the other similar set
%% operations) is to build the lists of elements, traverse these lists
-%% in parallel while building a reversed ackumulator list, and finally
-%% rebuild the tree directly from the ackumulator. Other methods of
+%% in parallel while building a reversed accumulator list, and finally
+%% rebuild the tree directly from the accumulator. Other methods of
%% traversing the elements can be devised, but they all have higher
%% overhead.
@@ -1035,7 +1017,7 @@ union_1([], S) ->
%% that the same is likely to apply to the next element also,
%% statistically reducing the number of failed tests and automatically
%% adapting to cases of lists having very different lengths. This saves
-%% 10-40% of the traversation time compared to a "fixed" strategy,
+%% 10-40% of the traversal time compared to a "fixed" strategy,
%% depending on the sizes and contents of the lists.
%%
%% 3) A tail recursive version using `lists:reverse/2' is about 5-10%
@@ -1092,7 +1074,7 @@ all sets, without duplicates.
```erlang
1> S0 = gb_sets:from_list([a,b,c,d]).
2> S1 = gb_sets:from_list([d,e,f]).
-3> S2 = gb_sets:from_list([q,r])
+3> S2 = gb_sets:from_list([q,r]).
4> Sets = [S0, S1, S2].
5> Union = gb_sets:union(Sets).
6> gb_sets:to_list(Union).
@@ -1100,7 +1082,7 @@ all sets, without duplicates.
```
""".
-spec union(SetList) -> Set when
- SetList :: [set(Element),...],
+ SetList :: [set(Element)],
Set :: set(Element).
union([S | Ss]) ->
@@ -1194,7 +1176,7 @@ elements that are present in all sets.
```erlang
1> S0 = gb_sets:from_list([a,b,c,d]).
2> S1 = gb_sets:from_list([d,e,f]).
-3> S2 = gb_sets:from_list([q,r])
+3> S2 = gb_sets:from_list([q,r]).
4> Sets = [S0, S1, S2].
5> gb_sets:to_list(gb_sets:intersection([S0, S1, S2])).
[]
@@ -1221,7 +1203,7 @@ Returns `true` if `Set1` and `Set2` are disjoint; otherwise, returns
Two sets are disjoint if they have no elements in common.
-This function is equivalent to `gb_sets:intersection(Set1, Set2) =:= []`,
+This function is equivalent to `gb_sets:is_empty(gb_sets:intersection(Set1, Set2))`,
but faster.
## Examples
@@ -1229,7 +1211,7 @@ but faster.
```erlang
1> S0 = gb_sets:from_list([a,b,c,d]).
2> S1 = gb_sets:from_list([d,e,f]).
-3> S2 = gb_sets:from_list([q,r])
+3> S2 = gb_sets:from_list([q,r]).
4> gb_sets:is_disjoint(S0, S1).
false
5> gb_sets:is_disjoint(S1, S2).
@@ -1493,13 +1475,13 @@ value, with `true` being equivalent to `{true, Elem}`.
```erlang
filtermap(Fun, Set1) ->
- gb_sets:from_list(lists:filtermap(Fun, Set1)).
+ gb_sets:from_list(lists:filtermap(Fun, gb_sets:to_list(Set1))).
```
## Examples
```erlang
-1> S = gb_sets:from_list([2,4,5,6,8,9])
+1> S = gb_sets:from_list([2,4,5,6,8,9]).
2> F = fun(X) ->
case X rem 2 of
0 -> {true, X div 2};
diff --git a/lib/stdlib/src/lists.erl b/lib/stdlib/src/lists.erl
index e93f564209..1b6f9043e2 100644
--- a/lib/stdlib/src/lists.erl
+++ b/lib/stdlib/src/lists.erl
@@ -342,7 +342,7 @@ starting at `N+1` and continuing to the end of the list.
""".
-spec nthtail(N, List) -> Tail when
N :: non_neg_integer(),
- List :: [T,...],
+ List :: [T],
Tail :: [T],
T :: term().
@@ -1894,7 +1894,7 @@ sort(Fun, [X, Y | T]) ->
-doc """
Returns a sorted list formed by merging `List1` and `List2` based on `Fun`.
-Both `List1` and`List2` must be sorted according to the
+Both `List1` and `List2` must be sorted according to the
[ordering function](`m:lists#ordering_function`) `Fun` before evaluating this
function.
@@ -2682,7 +2682,7 @@ Combines the operations of `map/2` and `foldr/3` into one pass.
> #### Note {: .info }
>
> Unless the order in which the elements are accumulated is important,
-> prefer [`mapfoldl/3`](`mapfoldl/3`) as it is slighly more efficient.
+> prefer [`mapfoldl/3`](`mapfoldl/3`) as it is slightly more efficient.
## Examples
diff --git a/lib/stdlib/src/ordsets.erl b/lib/stdlib/src/ordsets.erl
index 34547e1ee5..20aad6a9ad 100644
--- a/lib/stdlib/src/ordsets.erl
+++ b/lib/stdlib/src/ordsets.erl
@@ -60,11 +60,11 @@ Returns a new empty ordered set.
## Examples
```erlang
-1> ordsets:new()
+1> ordsets:new().
[]
```
""".
--spec new() -> [].
+-spec new() -> ordset(none()).
new() -> [].
@@ -146,9 +146,9 @@ of one set is also a member of the other set; otherwise, returns `false`.
```erlang
1> Empty = ordsets:new().
2> S = ordsets:from_list([a,b]).
-3> ordsets:is_equal(S, S)
+3> ordsets:is_equal(S, S).
true
-4> ordsets:is_equal(S, Empty)
+4> ordsets:is_equal(S, Empty).
false
```
""".
@@ -305,7 +305,7 @@ all sets, without duplicates.
```erlang
1> S0 = ordsets:from_list([a,b,c,d]).
2> S1 = ordsets:from_list([d,e,f]).
-3> S2 = ordsets:from_list([q,r])
+3> S2 = ordsets:from_list([q,r]).
4> Sets = [S0, S1, S2].
5> ordsets:union(Sets).
[a,b,c,d,e,f,q,r]
@@ -363,7 +363,7 @@ elements that are present in all sets.
```erlang
1> S0 = ordsets:from_list([a,b,c,d]).
2> S1 = ordsets:from_list([d,e,f]).
-3> S2 = ordsets:from_list([q,r])
+3> S2 = ordsets:from_list([q,r]).
4> Sets = [S0, S1, S2].
5> ordsets:intersection([S0, S1, S2]).
[]
@@ -391,8 +391,7 @@ returns `false`.
Two sets are disjoint if they have no elements in common.
-This function is equivalent to `ordsets:intersection(Ordset1, Ordset2)
-=:= []`, but faster.
+This function is equivalent to `ordsets:is_empty(ordsets:intersection(Ordset1, Ordset2))`, but faster.
## Examples
@@ -555,13 +554,13 @@ value, with `true` being equivalent to `{true, Elem}`.
```erlang
filtermap(Fun, Ordset1) ->
- ordsets:from_list(lists:filtermap(Fun, Ordset1)).
+ ordsets:from_list(lists:filtermap(Fun, ordsets:to_list(Ordset1))).
```
## Examples
```erlang
-1> S = ordsets:from_list([2,4,5,6,8,9])
+1> S = ordsets:from_list([2,4,5,6,8,9]).
2> F = fun(X) ->
case X rem 2 of
0 -> {true, X div 2};
@@ -574,7 +573,7 @@ filtermap(Fun, Ordset1) ->
""".
-doc(#{since => <<"OTP 27.0">>}).
-spec filtermap(Fun, Ordset1) -> Ordset2 when
- Fun :: fun((Element1 :: T1) -> boolean | ({true, Element2 :: T2})),
+ Fun :: fun((Element1 :: T1) -> boolean() | {true, Element2 :: T2}),
Ordset1 :: ordset(T1),
Ordset2 :: ordset(T1 | T2).
diff --git a/lib/stdlib/src/queue.erl b/lib/stdlib/src/queue.erl
index 47a6c1a8bb..5a21a8588c 100644
--- a/lib/stdlib/src/queue.erl
+++ b/lib/stdlib/src/queue.erl
@@ -123,7 +123,7 @@ new() -> {[],[]}. %{RearList,FrontList}
-doc """
Tests if `Term` is a queue and returns `true` if so, otherwise `false`. Note
that the test will return `true` for a term coinciding with the representation
-of a queue, even when not constructed by thus module. See also note on
+of a queue, even when not constructed by this module. See also note on
[data types](`e:system:data_types.md#no_user_types`).
""".
-doc(#{group => <<"Original API">>}).
@@ -161,9 +161,11 @@ the queue becomes the head of the list.
_Example:_
```erlang
-1> Queue = queue:from_list([1,2,3,4,5]).
+1> List = [1, 2, 3, 4, 5].
+[1,2,3,4,5]
+2> Queue = queue:from_list(List).
{[5,4,3],[1,2]}
-2> List == queue:to_list(Queue).
+3> List =:= queue:to_list(Queue).
true
```
""".
@@ -472,7 +474,7 @@ _Example:_
```erlang
1> Queue = queue:from_list([1,2,3,4,5]).
{[5,4,3],[1,2]}
-2> Queue = queue:drop(Queue).
+2> Queue1 = queue:drop(Queue).
{[5,4,3],[2]}
3> queue:to_list(Queue1).
[2,3,4,5]
@@ -507,7 +509,7 @@ _Example:_
```erlang
1> Queue = queue:from_list([1,2,3,4,5]).
{[5,4,3],[1,2]}
-2> Queue = queue:drop_r(Queue).
+2> Queue1 = queue:drop_r(Queue).
{[4,3],[1,2]}
3> queue:to_list(Queue1).
[1,2,3,4]
@@ -620,7 +622,7 @@ split_r1_to_f2(N, [X|R1], F1, R2, F2) ->
%% filter, or rather filtermap with insert, traverses in queue order
%%
%% Fun(_) -> List: O(length(List) * len(Q))
-%% else: O(len(Q)
+%% else: O(len(Q))
-doc """
Returns a queue `Q2` that is the result of calling `Fun(Item)` on all items in
`Q1`.
@@ -721,16 +723,16 @@ queue element at this position is replaced with `NewItem` in the result queue.
_Example 1:_
```erlang
-1> Queue = queue:from_list([1,2,3,4,5]).
+1> Queue = queue:from_list([1, 2, 3, 4, 5]).
{[5,4,3],[1,2]}
2> Queue1 = queue:filtermap(fun (E) -> E > 2 end, Queue).
{[5],[3,4]}
3> queue:to_list(Queue1).
[3,4,5]
-4> Queue1 = queue:filtermap(fun (E) -> {true, E+100} end, Queue).
-{"ihg","ef"}
-5> queue:to_list(Queue1).
-"efghi
+4> Queue2 = queue:filtermap(fun (E) -> {true, E - 100} end, Queue).
+{[-95,-96,-97],[-99,-98]}
+5> queue:to_list(Queue2).
+[-99,-98,-97,-96,-95]
```
""".
-doc(#{group => <<"Original API">>,since => <<"OTP 24.0">>}).
@@ -956,7 +958,7 @@ _Example:_
```erlang
1> Queue = queue:from_list([100,1,2,3,4,5]).
-2> Queue1 = queue:delete_with(fun (E) -> E > 0, Queue).
+2> Queue1 = queue:delete_with(fun (E) -> E > 0 end, Queue).
3> queue:to_list(Queue1).
[1,2,3,4,5]
```
@@ -998,7 +1000,7 @@ _Example:_
```erlang
1> Queue = queue:from_list([1,2,3,4,5,100]).
-2> Queue1 = queue:delete_with(fun (E) -> E > 10, Queue).
+2> Queue1 = queue:delete_with(fun (E) -> E > 10 end, Queue).
3> queue:to_list(Queue1).
[1,2,3,4,5]
```
@@ -1074,7 +1076,7 @@ delete_with_rear(_, []) ->
%%
%% An alternative would be to balance for equal list length when one side
%% is exhausted. Although this could be better for a general double
-%% ended queue, it would more han double the amortized cost for
+%% ended queue, it would more than double the amortized cost for
%% the normal case (one way queue).
%% Cons to head
diff --git a/lib/stdlib/src/sets.erl b/lib/stdlib/src/sets.erl
index 5ef937a670..94b4f99fac 100644
--- a/lib/stdlib/src/sets.erl
+++ b/lib/stdlib/src/sets.erl
@@ -78,6 +78,7 @@ representations.
- `from_list/1`
- `intersection/1`
- `intersection/2`
+- `is_disjoint/2`
- `is_element/2`
- `is_empty/1`
- `is_equal/2`
@@ -326,9 +327,9 @@ of one set is also a member of the other set; otherwise, returns `false`.
```erlang
1> Empty = sets:new().
2> S = sets:from_list([a,b]).
-3> sets:is_equal(S, S)
+3> sets:is_equal(S, S).
true
-4> sets:is_equal(S, Empty)
+4> sets:is_equal(S, Empty).
false
5> OldSet = sets:from_list([a,b], [{version,1}]).
6> sets:is_equal(S, OldSet).
@@ -651,7 +652,7 @@ Returns `true` if `Set1` and `Set2` are disjoint; otherwise, returns
Two sets are disjoint if they have no elements in common.
-This function is equivalent to `sets:intersection(Set1, Set2) =:= []`,
+This function is equivalent to `sets:is_empty(sets:intersection(Set1, Set2))`,
but faster.
## Examples
@@ -910,7 +911,7 @@ value, with `true` being equivalent to `{true, Elem}`.
```erlang
filtermap(Fun, Set1) ->
- sets:from_list(lists:filtermap(Fun, Set1)).
+ sets:from_list(lists:filtermap(Fun, sets:to_list(Set1))).
```
## Examples
--
2.51.0