Skip to main content

A typesafe list with more method chaining!

Project description

Slist

This is a drop in replacement for the built-in mutable python list

But with more post-fixed methods for chaining in a typesafe manner!!

Leverage the latest pyright features to spot errors during coding.

All these methods return a new list. They do not mutate the original list.

Not able to convince your colleagues to use immutable functional data structures? I understand.
This library lets you still have the benefits of typesafe chaining methods while letting your colleagues have their mutable lists!

pypi python Build Status

pip install slist

Quick Start

Easily spot errors when you call the wrong methods on your sequence with mypy.

from slist import Slist

many_strings = Slist(["Lucy, Damion, Jon"])  # Slist[str]
many_strings.sum()  # Mypy errors with 'Invalid self argument'. You can't sum a sequence of strings!

many_nums = Slist([1, 1.2])
assert many_nums.sum() == 2.2  # ok!

class CannotSortMe:
    def __init__(self, value: int):
        self.value: int = value

stuff = Slist([CannotSortMe(value=1), CannotSortMe(value=1)])
stuff.sort_by(lambda x: x)  # Mypy errors with 'Cannot be "CannotSortMe"'. There isn't a way to sort by the class itself
stuff.sort_by(lambda x: x.value)  # ok! You can sort by the value

Slist([{"i am a dict": "value"}]).distinct_by(
    lambda x: x
)  # Mypy errors with 'Cannot be Dict[str, str]. You can't hash a dict itself

Slist provides methods to easily flatten and infer the types of your data.

from slist import Slist, List
from typing import Optional

test_optional: Slist[Optional[int]] = Slist([-1, 0, 1]).map(
    lambda x: x if x >= 0 else None
)
# Mypy infers slist[int] correctly
test_flattened: Slist[int] = test_optional.flatten_option()


test_nested: Slist[List[str]] = Slist([["bob"], ["dylan", "chan"]])
# Mypy infers slist[str] correctly
test_flattened_str: Slist[str] = test_nested.flatten_list()

There are plenty more methods to explore!

from slist import Slist

result = (
    Slist([1, 2, 3])
    .repeat_until_size_or_raise(20)
    .grouped(2)
    .map(lambda inner_list: inner_list[0] + inner_list[1] if inner_list.length == 2 else inner_list[0])
    .flatten_option()
    .distinct_by(lambda x: x)
    .map(str)
    .reversed()
    .mk_string(sep=",")
)
assert result == "5,4,3"

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

slist-0.3.11.tar.gz (13.9 kB view details)

Uploaded Source

Built Distribution

slist-0.3.11-py3-none-any.whl (11.0 kB view details)

Uploaded Python 3

File details

Details for the file slist-0.3.11.tar.gz.

File metadata

  • Download URL: slist-0.3.11.tar.gz
  • Upload date:
  • Size: 13.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for slist-0.3.11.tar.gz
Algorithm Hash digest
SHA256 e2c7b9c5a78bee1936c2092c4d19e6d5f6a54234251c8ab0eeb9d721b27d1ab7
MD5 4be2f479236c1d29c525a8cedb195a6f
BLAKE2b-256 4e26a0e694ecbbddb7c2363865a5e106b967ac0f5c76c46e2c60d71f55f640dc

See more details on using hashes here.

File details

Details for the file slist-0.3.11-py3-none-any.whl.

File metadata

  • Download URL: slist-0.3.11-py3-none-any.whl
  • Upload date:
  • Size: 11.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for slist-0.3.11-py3-none-any.whl
Algorithm Hash digest
SHA256 16dc774a46b035a1dc1fead451d9869734dcb9518a7092bd20f02edcc37723f4
MD5 2ed22565aa3c6cf52ff75234a3281dd7
BLAKE2b-256 39a65844992e0abc645e8f8de3a3d680d8192409f662c3a74a50aa62e94a395c

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page