pythonic-fp.containers 4.0.0__py3-none-any.whl → 4.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- # Copyright 2023-2025 Geoffrey R. Scheller
1
+ # Copyright 2023-2026 Geoffrey R. Scheller
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -13,19 +13,18 @@
13
13
  # limitations under the License.
14
14
 
15
15
  """
16
- Container with FP interfaces
17
- ============================
16
+ Containers with FP interfaces
17
+ -----------------------------
18
18
 
19
- +---------------------------------------------+-----------+------------------+
20
- | module | class | description |
21
- +=============================================+===========+==================+
22
- | ``pythonic_fp.containers.functional_tuple`` | FTuple | Functional Tuple |
23
- +---------------------------------------------+-----------+------------------+
24
- | ``pythonic_fp.containers.immutable_list`` | IList | Immutable List |
25
- +---------------------------------------------+-----------+------------------+
19
+ .. admonition:: Functional variants of Python builtins
20
+
21
+ Not sure the direction this should take.
22
+
23
+ - class **FTuple:** A tuple-like object with a functional interface.
24
+ - class **IList:** An immutable, hashable list-like object.
26
25
 
27
26
  """
28
27
 
29
28
  __author__ = 'Geoffrey R. Scheller'
30
- __copyright__ = 'Copyright (c) 2023-2025 Geoffrey R. Scheller'
29
+ __copyright__ = 'Copyright (c) 2023-2026 Geoffrey R. Scheller'
31
30
  __license__ = 'Apache License 2.0'
@@ -1,4 +1,5 @@
1
- # Copyright 2023-2025 Geoffrey R. Scheller
1
+ # Copyright 2023-2026 Geoffrey R. Scheller
2
+
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
4
5
  # you may not use this file except in compliance with the License.
@@ -12,8 +13,6 @@
12
13
  # See the License for the specific language governing permissions and
13
14
  # limitations under the License.
14
15
 
15
- """Pythonic FP - Functional Tuple"""
16
-
17
16
  from collections.abc import Callable, Iterator
18
17
  from typing import cast, Never, overload, SupportsIndex
19
18
  from pythonic_fp.iterables.folding import accumulate
@@ -23,28 +22,43 @@ __all__ = ['FTuple']
23
22
 
24
23
 
25
24
  class FTuple[D](tuple[D, ...]):
26
- """Functional Tuple suitable for inheritance.
25
+ """
26
+ .. admonition:: Functional Tuple
27
27
 
28
- - supports both indexing and slicing
29
- - int multiplication and FTuple addition supported
28
+ - intended for further inheritance
29
+ - supports both indexing and slicing
30
+ - int multiplication and FTuple addition supported
31
+ - addition concatenates results, resulting in a Union type
32
+ - both left and right int multiplication supported
33
+ - homogeneous in its data type
34
+ - unslotted
30
35
 
31
- - addition concatenates results, resulting in a Union type
32
- - both left and right int multiplication supported
33
- - homogeneous in its data type
34
- - supports being further inherited from
35
- - unslotted
36
+ .. note::
37
+
38
+ Example of code very early in project. Different ways
39
+ to use __dunders__ than what I do lately.
36
40
 
37
- Since these tuples are homogeneous, their covariance may be quirky.
38
41
  """
39
42
 
40
43
  def __reversed__(self) -> Iterator[D]:
44
+ """
45
+ .. admonition:: reverse iter
46
+
47
+ :yields: the tuples elements in reverse order
48
+
49
+ """
41
50
  for ii in range(len(self) - 1, -1, -1):
42
51
  yield (self[ii])
43
52
 
44
- def __repr__(self) -> str:
45
- return f'{self.__class__.__name__}(' + ', '.join(map(repr, self)) + ')'
46
-
47
53
  def __eq__(self, other: object, /) -> bool:
54
+ """
55
+ .. admonition:: equality comparison
56
+
57
+ :param other: The ``object`` to which to be compared.
58
+ :returns: ``True`` if ``other`` is the same type and
59
+ corresponding elements compare as equal.
60
+
61
+ """
48
62
  if not isinstance(other, self.__class__):
49
63
  return False
50
64
  if (length := len(self)) != len(other):
@@ -67,6 +81,9 @@ class FTuple[D](tuple[D, ...]):
67
81
  else:
68
82
  return super().__getitem__(idx)
69
83
 
84
+ def __repr__(self) -> str:
85
+ return f'{self.__class__.__name__}(' + ', '.join(map(repr, self)) + ')'
86
+
70
87
  def foldl[L](
71
88
  self,
72
89
  f: Callable[[L, D], L],
@@ -74,16 +91,21 @@ class FTuple[D](tuple[D, ...]):
74
91
  start: L | None = None,
75
92
  default: L | None = None,
76
93
  ) -> L:
77
- """Fold Left with optional starting and default values.
94
+ """
95
+ .. admonition:: fold left
96
+
97
+ Reduce left with optional starting and default values.
78
98
 
79
- - fold left with an optional starting value
80
- - first argument of function ``f`` is for the accumulated value
99
+ :param f: The folding function, first argument is for
100
+ the accumulated value.
101
+ :param start: An optional starting value.
102
+ :param default: An optional default value
103
+ if fold does not exist.
104
+ :raises ValueError: When ``FTuple`` empty and a start value
105
+ was not not given.
106
+ :returns: Folded value if it exists, otherwise
107
+ the default value if given.
81
108
 
82
- :param f: The folding function, first argument is for the accumulated value.
83
- :param start: An optional starting value.
84
- :param default: An optional default value if fold does not exist.
85
- :raises ValueError: When ``FTuple`` empty and a start value not given.
86
- :returns: The folded value if it exists, otherwise the default value.
87
109
  """
88
110
  it_self = iter(self)
89
111
  if start is not None:
@@ -106,13 +128,21 @@ class FTuple[D](tuple[D, ...]):
106
128
  start: R | None = None,
107
129
  default: R | None = None,
108
130
  ) -> R:
109
- """Fold Right with optional starting and default values.
131
+ """
132
+ .. admonition:: fold right
133
+
134
+ Reduce right with optional starting and default values.
135
+
136
+ :param f: The folding function, second argument is for
137
+ the accumulated value.
138
+ :param start: An optional starting value.
139
+ :param default: An optional default value
140
+ if fold does not exist.
141
+ :raises ValueError: when ``FTuple`` empty and a start value
142
+ was not given
143
+ :returns: The folded value if it exists, otherwise
144
+ the default value if given.
110
145
 
111
- :param f: The folding function, second argument is for the accumulated value.
112
- :param start: An optional starting value.
113
- :param default: An optional default value if fold does not exist.
114
- :raises ValueError: when FTuple empty and a start value not given
115
- :returns: The folded value if it exists, otherwise the default value.
116
146
  """
117
147
  it_self = reversed(self)
118
148
  if start is not None:
@@ -129,9 +159,14 @@ class FTuple[D](tuple[D, ...]):
129
159
  return acc
130
160
 
131
161
  def copy(self) -> 'FTuple[D]':
132
- """Return a shallow copy of ``FTuple`` in O(1) time & space complexity.
162
+ """
163
+ .. admonition:: copy
164
+
165
+ Return a shallow copy of ``FTuple`` in O(1)
166
+ time & space complexity.
167
+
168
+ :returns: A new ``FTuple`` instance.
133
169
 
134
- :returns: New ``FTuple``.
135
170
  """
136
171
  return self.__class__(self)
137
172
 
@@ -150,20 +185,26 @@ class FTuple[D](tuple[D, ...]):
150
185
  def accummulate[L](
151
186
  self, f: Callable[[L, D], L], s: L | None = None, /
152
187
  ) -> 'FTuple[L]':
153
- """Accumulate partial folds.
188
+ """
189
+ .. admonition:: accumulate partial folds
154
190
 
155
- Accumulate partial fold with an optional starting value,
156
- results in an ``FTuple``.
191
+ :param f: Folding function used to produce partial folds.
192
+ :param s: Optional starting value.
193
+ :returns: New ``FTuple`` of the partial folds.
157
194
 
158
- :param f: Folding function used to produce partial folds.
159
- :param s: Optional starting value.
160
- :returns: New ``FTuple`` of the partial folds.
161
195
  """
162
196
  if s is None:
163
197
  return FTuple(accumulate(self, f))
164
198
  return FTuple(accumulate(self, f, s))
165
199
 
166
200
  def map[U](self, f: Callable[[D], U], /) -> 'FTuple[U]':
201
+ """
202
+ .. admonition:: map
203
+
204
+ :param f: Folding function used to produce partial folds.
205
+ :returns: A new ``FTuple`` instance.
206
+
207
+ """
167
208
  return FTuple(map(f, self))
168
209
 
169
210
  def bind[U](
@@ -172,13 +213,18 @@ class FTuple[D](tuple[D, ...]):
172
213
  merge_type: MergeEnum = MergeEnum.Concat,
173
214
  yield_partials: bool = False,
174
215
  ) -> 'FTuple[U] | Never':
175
- """Bind function ``f`` to the ``FTuple``.
216
+ """
217
+ .. admonition:: bind
218
+
219
+ Flat map function ``f`` with the ``FTuple`` with different
220
+ merging strategies.
221
+
222
+ :param f: Function ``D -> FTuple[U]``
223
+ :param merge_type: ``MergeEnum`` to determine how to merge the result.
224
+ :param yield_partials: Yield unmatched values if ``MergeEnum`` given as merge type.
225
+ :returns: A new ``FTuple`` instance.
226
+ :raises ValueError: If given an unknown merge enumeration.
176
227
 
177
- :param f: Function ``D -> FTuple[U]``
178
- :param merge_type: ``MergeEnum`` to determine how to merge the result.
179
- :param yield_partials: Yield unmatched values if ``MergeEnum`` given as merge type.
180
- :return: Resulting ``FTuple``.
181
- :raises ValueError: If given an unknown merge enumeration.
182
228
  """
183
229
  return FTuple(
184
230
  blend(*map(f, self), merge_enum=merge_type, yield_partials=yield_partials)
@@ -1,4 +1,4 @@
1
- # Copyright 2023-2025 Geoffrey R. Scheller
1
+ # Copyright 2023-2026 Geoffrey R. Scheller
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -12,8 +12,6 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- """Pythonic FP - Immutable guaranteed hashable lists."""
16
-
17
15
  from collections.abc import Callable, Iterable, Iterator, Hashable
18
16
  from typing import cast, Never, overload
19
17
  from pythonic_fp.iterables.folding import accumulate
@@ -23,30 +21,34 @@ __all__ = ['IList']
23
21
 
24
22
 
25
23
  class IList[D](Hashable):
26
- """Immutable List like data structure.
24
+ """
25
+ .. admonition:: immutable list like data structure
27
26
 
28
- - hashability should be enforced by LSP tooling
29
- - hashability will be enforced at runtime
30
- - its method type parameters are also covariant
31
- - supports both indexing and slicing
32
- - addition and left & right ``int`` multiplication supported
27
+ - hashability should be enforced by LSP tooling
28
+ - hashability will be enforced at runtime
29
+ - its method type parameters are also covariant
30
+ - supports both indexing and slicing
31
+ - addition and left & right ``int`` multiplication supported
33
32
 
34
- - addition is concatenation resulting in a union type
33
+ - addition is concatenation resulting in a union type
35
34
 
36
35
  """
37
36
 
38
37
  __slots__ = ('_ds', '_len', '_hash')
39
38
  __match_args__ = ('_ds', '_len')
40
39
 
41
- def __init__(self, *dss: Iterable[D]) -> None:
40
+ def __init__(self, *ds: Iterable[D]) -> None:
42
41
  """
43
- :param dss: 0 or 1 iterables
42
+ .. admonition:: init
43
+
44
+ :param ds: One optional iterable.
45
+
44
46
  """
45
- if (size := len(dss)) > 1:
47
+ if (size := len(ds)) > 1:
46
48
  msg = f'IList expects at most 1 iterable argument, got {size}'
47
49
  raise ValueError(msg)
48
50
  else:
49
- self._ds: tuple[D, ...] = tuple(dss[0]) if size == 1 else tuple()
51
+ self._ds: tuple[D, ...] = tuple(ds[0]) if size == 1 else tuple()
50
52
  self._len = len(self._ds)
51
53
  try:
52
54
  self._hash = hash((self._len, 42) + self._ds)
@@ -55,26 +57,55 @@ class IList[D](Hashable):
55
57
  raise TypeError(msg)
56
58
 
57
59
  def __hash__(self) -> int:
60
+ """
61
+ .. admonition:: hash
62
+
63
+ Hashability enforced at runtime by initializer.
64
+
65
+ :returns: Hash value.
66
+
67
+ """
58
68
  return self._hash
59
69
 
60
70
  def __iter__(self) -> Iterator[D]:
71
+ """
72
+ .. admonition:: iterate
73
+
74
+ Forward iterate, left to right.
75
+
76
+ :yields: The contained values.
77
+
78
+ """
61
79
  return iter(self._ds)
62
80
 
63
81
  def __reversed__(self) -> Iterator[D]:
82
+ """
83
+ .. admonition:: iterate
84
+
85
+ Reverse iterate, left to right.
86
+
87
+ :yields: The contained values in reverse order.
88
+
89
+ """
64
90
  return reversed(self._ds)
65
91
 
66
92
  def __bool__(self) -> bool:
93
+ """
94
+ .. admonition:: bool
95
+
96
+ :returns: ``True`` if not empty, ``False`` if empty.
97
+
98
+ """
67
99
  return bool(self._ds)
68
100
 
69
101
  def __len__(self) -> int:
70
- return len(self._ds)
71
-
72
- def __repr__(self) -> str:
73
- return 'immutable_list(' + ', '.join(map(repr, self)) + ')'
102
+ """
103
+ .. admonition:: len
74
104
 
75
- def __str__(self) -> str:
76
- return '((' + ', '.join(map(repr, self)) + '))'
105
+ :returns: The number of items in the ``Ilist``.
77
106
 
107
+ """
108
+ return len(self._ds)
78
109
  def __eq__(self, other: object, /) -> bool:
79
110
  if not isinstance(other, IList):
80
111
  return NotImplemented # magic object
@@ -90,10 +121,37 @@ class IList[D](Hashable):
90
121
  def __getitem__(self, idx: slice, /) -> 'IList[D]': ...
91
122
 
92
123
  def __getitem__(self, idx: slice | int, /) -> 'IList[D] | D':
124
+ """
125
+ .. admonition:: getitem
126
+
127
+ Indexable and sliceable but otherwise immutable.
128
+
129
+ :param idx: Either a ``slice`` or and ``index``.
130
+ :returns: A slice or the value.
131
+
132
+ """
93
133
  if isinstance(idx, slice):
94
134
  return IList(self._ds[idx])
95
135
  return self._ds[idx]
96
136
 
137
+ def __repr__(self) -> str:
138
+ """
139
+ .. admonition:: repr string
140
+
141
+ :returns: A string to reproduce the value.
142
+
143
+ """
144
+ return 'immutable_list(' + ', '.join(map(repr, self)) + ')'
145
+
146
+ def __str__(self) -> str:
147
+ """
148
+ .. admonition:: user string
149
+
150
+ :returns: A string meaningful to an end user.
151
+
152
+ """
153
+ return '((' + ', '.join(map(repr, self)) + '))'
154
+
97
155
  def foldl[L](
98
156
  self,
99
157
  f: Callable[[L, D], L],
@@ -101,13 +159,17 @@ class IList[D](Hashable):
101
159
  start: L | None = None,
102
160
  default: L | None = None,
103
161
  ) -> L | None:
104
- """Fold Left.
162
+ """
163
+ .. admonition:: fold left
164
+
165
+ :param f: Folding function, first argument is for
166
+ the accumulated value.
167
+ :param start: Optional starting value.
168
+ :param default: Optional default value if fold does not exist.
169
+ :returns: Left folded value.
170
+ :raises ValueError: When empty and neither a start value or
171
+ default value not given.
105
172
 
106
- :param f: Folding function, first argument is for the accumulated value.
107
- :param start: Optional starting value.
108
- :param default: Optional default value if fold does not exist.
109
- :returns: Folded value.
110
- :raises ValueError: When empty and a start value not given.
111
173
  """
112
174
  it = iter(self._ds)
113
175
  if start is not None:
@@ -132,13 +194,17 @@ class IList[D](Hashable):
132
194
  start: R | None = None,
133
195
  default: R | None = None,
134
196
  ) -> R | None:
135
- """Fold Right.
197
+ """
198
+ .. admonition:: fold right
199
+
200
+ :param f: Folding function, second argument is for
201
+ the accumulated value.
202
+ :param start: Optional starting value.
203
+ :param default: Optional default value if fold does not exist.
204
+ :returns: Right folded value.
205
+ :raises ValueError: When empty and neither a start value or
206
+ default value not given.
136
207
 
137
- :param f: Folding function, second argument is for the accumulated value.
138
- :param start: Optional starting value.
139
- :param default: Optional default value if fold does not exist.
140
- :returns: Folded value.
141
- :raises ValueError: When empty and a start value not given.
142
208
  """
143
209
  it = reversed(self._ds)
144
210
  if start is not None:
@@ -157,6 +223,18 @@ class IList[D](Hashable):
157
223
  return acc
158
224
 
159
225
  def __add__(self, other: 'IList[D]', /) -> 'IList[D]':
226
+ """
227
+ .. admonition:: add by concatenation
228
+
229
+ :param other: The ``other`` same typed ``IList``.
230
+ :returns: New ``IList`` instance with concatenated values.
231
+ :raises ValueError: When ``other`` is not an ``IList``.
232
+
233
+ .. admonition:: TODO
234
+
235
+ Return ``NotImplemented`` if appropriate?
236
+
237
+ """
160
238
  if not isinstance(other, IList):
161
239
  msg = 'IList being added to something not an IList'
162
240
  raise ValueError(msg)
@@ -164,28 +242,59 @@ class IList[D](Hashable):
164
242
  return IList(concat(self, other))
165
243
 
166
244
  def __mul__(self, num: int, /) -> 'IList[D]':
245
+ """
246
+ .. admonition:: add by concatenation
247
+
248
+ :param other: The ``other`` same typed ``IList``.
249
+ :returns: New ``IList`` instance with concatenated values.
250
+ :raises ValueError: When ``other`` is not an ``IList``.
251
+
252
+ .. admonition:: TODO
253
+
254
+ Consider returning ``NotImplemented`` if appropriate?
255
+ Maybe define a "column vector" version?
256
+
257
+ """
167
258
  return IList(self._ds.__mul__(num if num > 0 else 0))
168
259
 
169
260
  def __rmul__(self, num: int, /) -> 'IList[D]':
261
+ """
262
+ .. admonition:: concatenation with itself
263
+
264
+ :param num: Number of times to concatenate ``IList``
265
+ with itself.
266
+ :returns: A new ``IList`` instance with concatenated values.
267
+ :raises ValueError: When ``other`` is not an ``IList``.
268
+
269
+ """
170
270
  return IList(self._ds.__mul__(num if num > 0 else 0))
171
271
 
172
272
  def accummulate[L](
173
273
  self, f: Callable[[L, D], L], s: L | None = None, /
174
274
  ) -> 'IList[L]':
175
- """Accumulate partial folds.
275
+ """
276
+ .. admonition:: accumulate partial folds
277
+
278
+ Accumulate partial fold with an optional starting value,
279
+ results in an ``IList``.
176
280
 
177
- Accumulate partial fold with an optional starting value,
178
- results in an ``IList``.
281
+ :param f: Folding function used to produce partial folds.
282
+ :param s: Optional starting value.
283
+ :returns: New ``IList`` of the partial folds.
179
284
 
180
- :param f: Folding function used to produce partial folds.
181
- :param s: Optional starting value.
182
- :returns: New ``FTuple`` of the partial folds.
183
285
  """
184
286
  if s is None:
185
287
  return IList(accumulate(self, f))
186
288
  return IList(accumulate(self, f, s))
187
289
 
188
290
  def map[U](self, f: Callable[[D], U], /) -> 'IList[U]':
291
+ """
292
+ .. admonition:: map
293
+
294
+ :parameter f: Function to map over the ``IList``.
295
+ :returns: A new ``IList`` instance with the mapped values.
296
+
297
+ """
189
298
  return IList(map(f, self))
190
299
 
191
300
  def bind[U](
@@ -194,20 +303,18 @@ class IList[D](Hashable):
194
303
  merge_enum: MergeEnum = MergeEnum.Concat,
195
304
  yield_partials: bool = False,
196
305
  ) -> 'IList[U] | Never':
197
- """Bind function `f` to the `IList`.
198
-
199
- :param ds: values to instantiate IList
200
- :return: resulting IList
201
- :raises ValueError: if given unknown merge_type
202
-
203
306
  """
204
- """Bind function ``f`` to the ``IList``.
307
+ .. admonition:: bind
308
+
309
+ :param f: Function ``D -> IList[U]`` to bind with different
310
+ merge strategies.
311
+ :param merge_type: ``MergeEnum`` to determine how to merge
312
+ the result.
313
+ :param yield_partials: Yield unmatched values if ``MergeEnum``
314
+ given as merge type.
315
+ :return: New ``IList`` instance.
316
+ :raises ValueError: If given an unknown merge enumeration.
205
317
 
206
- :param f: Function ``D -> IList[U]``
207
- :param merge_type: ``MergeEnum`` to determine how to merge the result.
208
- :param yield_partials: Yield unmatched values if ``MergeEnum`` given as merge type.
209
- :return: Resulting ``IList``.
210
- :raises ValueError: If given an unknown merge enumeration.
211
318
  """
212
319
  return IList(
213
320
  blend(*map(f, self), merge_enum=merge_enum, yield_partials=yield_partials)
@@ -7,7 +7,7 @@ __all__ = ['IList']
7
7
 
8
8
  class IList[D](Hashable):
9
9
  __match_args__: Incomplete
10
- def __init__(self, *dss: Iterable[D]) -> None: ...
10
+ def __init__(self, *ds: Iterable[D]) -> None: ...
11
11
  def __hash__(self) -> int: ...
12
12
  def __iter__(self) -> Iterator[D]: ...
13
13
  def __reversed__(self) -> Iterator[D]: ...
@@ -1,26 +1,26 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pythonic-fp-containers
3
- Version: 4.0.0
4
- Summary: Container with FP interfaces
3
+ Version: 4.1.0
4
+ Summary: Containers with FP interfaces
5
5
  Keywords: functional_containers,functional_tuple,immutable_list
6
6
  Author-email: "Geoffrey R. Scheller" <geoffrey@scheller.com>
7
- Requires-Python: >=3.12
7
+ Requires-Python: >=3.13
8
8
  Description-Content-Type: text/x-rst
9
9
  Classifier: Development Status :: 3 - Alpha
10
10
  Classifier: Framework :: Pytest
11
11
  Classifier: Intended Audience :: Developers
12
12
  Classifier: License :: OSI Approved :: Apache Software License
13
13
  Classifier: Operating System :: OS Independent
14
- Classifier: Programming Language :: Python :: 3.13
14
+ Classifier: Programming Language :: Python :: 3.14
15
15
  Classifier: Typing :: Typed
16
16
  License-File: LICENSE
17
- Requires-Dist: pythonic-fp-circulararray>=6.0.0
18
- Requires-Dist: pythonic-fp-fptools>=5.1.2
19
- Requires-Dist: pythonic-fp-iterables>=5.1.2
17
+ Requires-Dist: pythonic-fp-circulararray>=6.0.4
18
+ Requires-Dist: pythonic-fp-fptools>=5.2.0
19
+ Requires-Dist: pythonic-fp-iterables>=5.1.3
20
20
  Requires-Dist: pytest>=8.4.1 ; extra == "test"
21
21
  Project-URL: Changelog, https://github.com/grscheller/pythonic-fp-containers/blob/main/CHANGELOG.rst
22
- Project-URL: Documentation, https://grscheller.github.io/pythonic-fp/containers/development/build/html/
23
- Project-URL: Homepage, https://grscheller.github.io/pythonic-fp/homepage/build/html/
22
+ Project-URL: Documentation, https://grscheller.github.io/pythonic-fp/projects/containers.html
23
+ Project-URL: Homepage, https://grscheller.github.io/pythonic-fp/
24
24
  Project-URL: Source, https://github.com/grscheller/pythonic-fp-containers
25
25
  Provides-Extra: test
26
26
 
@@ -28,8 +28,8 @@ Pythonic FP - Containers
28
28
  ========================
29
29
 
30
30
  PyPI project
31
- `pythonic-fp.containers
32
- <https://pypi.org/project/pythonic-fp.containers>`_.
31
+ `pythonic-fp-containers
32
+ <https://pypi.org/project/pythonic-fp-containers>`_.
33
33
 
34
34
  Python package of container like data structures with functional
35
35
  programming inspired tweaks.
@@ -44,19 +44,19 @@ programming inspired tweaks.
44
44
 
45
45
  Part of the
46
46
  `pythonic-fp
47
- <https://grscheller.github.io/pythonic-fp/homepage/build/html/index.html>`_
47
+ <https://grscheller.github.io/pythonic-fp/>`_
48
48
  PyPI projects.
49
49
 
50
50
  Documentation
51
51
  -------------
52
52
 
53
- Documentation for this project is hosted on
53
+ Documentation and other links for this project are hosted on
54
54
  `GitHub Pages
55
- <https://grscheller.github.io/pythonic-fp/containers/development/build/html>`_.
55
+ <https://grscheller.github.io/pythonic-fp/projects/containers.html>`_.
56
56
 
57
57
  Copyright and License
58
58
  ---------------------
59
59
 
60
- Copyright (c) 2023-2025 Geoffrey R. Scheller. Licensed under the Apache
60
+ Copyright (c) 2023-2026 Geoffrey R. Scheller. Licensed under the Apache
61
61
  License, Version 2.0. See the LICENSE file for details.
62
62
 
@@ -0,0 +1,11 @@
1
+ pythonic_fp/containers/__init__.py,sha256=J1UvKHza0iDCR1GrVSUeps5LHsPc56xISvkbnGXOJtA,1034
2
+ pythonic_fp/containers/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ pythonic_fp/containers/functional_tuple.py,sha256=3Vdg3Fri5wGDdWv4bomS7xqWLy0B_eMQuXojZhgvKYM,7498
4
+ pythonic_fp/containers/functional_tuple.pyi,sha256=g8IvlIhPxecEsetEexZ7WmN9Ifdh-vAeK0z9SwLiCGE,1182
5
+ pythonic_fp/containers/immutable_list.py,sha256=9qtSF5R7O2f-Dzji2G11CneC0BTrk3WA5EV3z2sdnms,9796
6
+ pythonic_fp/containers/immutable_list.pyi,sha256=1p7w7FP-OpCHvCBJIlztoP_uUoZIoj9uI_XGKEib-kU,1371
7
+ pythonic_fp/containers/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ pythonic_fp_containers-4.1.0.dist-info/licenses/LICENSE,sha256=IJMkVWQUVy-SonK6SMaMotDQ6Zb-lVi2bUTiGp1GUO8,10774
9
+ pythonic_fp_containers-4.1.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
10
+ pythonic_fp_containers-4.1.0.dist-info/METADATA,sha256=I5j_6Nc6ykHEfx6ThA1S9x3ifqyHyYxdktbMw5wNr_w,2387
11
+ pythonic_fp_containers-4.1.0.dist-info/RECORD,,
@@ -1,11 +0,0 @@
1
- pythonic_fp/containers/__init__.py,sha256=48lsc3kU2Yf5IKjeExlOtO2ISwZv_1SWyL-e9OtP3VI,1346
2
- pythonic_fp/containers/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- pythonic_fp/containers/functional_tuple.py,sha256=aSFAnuAinT6XgLsRwh2JX1J6a6fFOJYS5N3TAUH5u0s,6518
4
- pythonic_fp/containers/functional_tuple.pyi,sha256=g8IvlIhPxecEsetEexZ7WmN9Ifdh-vAeK0z9SwLiCGE,1182
5
- pythonic_fp/containers/immutable_list.py,sha256=SoPYqIRgXbhfVC5dP9x1xYOIZqUrcIPH317A5bIPPos,7065
6
- pythonic_fp/containers/immutable_list.pyi,sha256=HRm0Updbx9UJpl5RI0prOwimSHDUJtM-3t2hEmYz6kw,1372
7
- pythonic_fp/containers/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- pythonic_fp_containers-4.0.0.dist-info/licenses/LICENSE,sha256=IJMkVWQUVy-SonK6SMaMotDQ6Zb-lVi2bUTiGp1GUO8,10774
9
- pythonic_fp_containers-4.0.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
10
- pythonic_fp_containers-4.0.0.dist-info/METADATA,sha256=sTGVrVvUqjf7KyG-FzkvpdcMrzuaWLomCDKoRjwbPDE,2438
11
- pythonic_fp_containers-4.0.0.dist-info/RECORD,,