Interfaces

We provide a lot of generic interfaces to write our bundeled and your own custom types.

These interfaces are designed:

  1. To be subclasses

  2. To provide abstract methods to implement in your own types

  3. To enforce correctness on final types

  4. To attach critical laws to be checked

We use Higher Kinded Types to define abstract methods.

Reading about interfaces will be the most useful if you plan to create your own containers.

General information

All the non-specific interfaces (e.g. MappableN, BindableN, ApplicativeN) can have Nth types, at the maximum of three possible types. What does this mean?

MappableN interface, for example, can have one, two or three possible types. See the example below:

>>> from typing import NoReturn

>>> from returns.interfaces.mappable import (
...    MappableN, Mappable1, Mappable2, Mappable3,
... )

>>> one_type: MappableN[int, NoReturn, NoReturn]
>>> two_types: MappableN[int, str, NoReturn]
>>> three_types: MappableN[int, str, bool]

>>> # We have a shortcut for each amount of arguments to reduce the boilerplate
>>> one_type: Mappable1[int]
>>> two_types: Mappable2[int, str]
>>> three_type: Mappable3[int, str, bool]

Naming convention

We follow a very specific naming convention in our interface names.

If interface does not depend on the number of types it works with and is always the same, we name it as is. For example, SupportsEquality is always the same and does not depend on the number of type arguments.

Secondly, if interface depends on the number of type arguments, it is named with N suffix in the end. It would always have numeric aliases for each number of arguments supported. For example, MappableN, Mappable1, Mappable2, and Mappable3.

The last criteria we have to decided on naming is “whether this interface always the same or it can have slight variations”? That’s why we have ResultLikeN and ResultBasedN interfaces. Because ResultBasedN has two extra methods compared to ResultLikeN. We use Like suffix for interfaces that descibes some similar types. We use Based suffix for interfaces that descire almost concrete types.

Laws

Some interfaces define its laws as values. These laws can be viewed as test that are attached to an interface.

We are able to check them of any type that implements a given interfaces with laws by our own check_all_laws hypothesis plugin.

In this docs we are going to describe each general interface and its laws.

Mappable

Something is considered mappable if we can map it using a function, generally map is a method that accepts a function.

An example in this library is Maybe, that implements the Mappable interface:

>>> from returns.maybe import Maybe, Some

>>> def can_be_mapped(string: str) -> str:
...     return string + '!'

>>> maybe_str: Maybe[str] = Some('example')
>>> assert maybe_str.map(can_be_mapped) == Some('example!')

MappableN interface help us to create our own mappable container like Maybe.

>>> from typing import Any, Callable, TypeVar

>>> from returns.interfaces.mappable import Mappable1
>>> from returns.primitives.hkt import SupportsKind1
>>> from returns.primitives.container import BaseContainer

>>> _NumberType = TypeVar('_NumberType')
>>> _NewNumberType = TypeVar('_NewNumberType')

>>> class Number(
...     BaseContainer,
...     SupportsKind1['Number', _NumberType],
...     Mappable1[_NumberType],
... ):
...     def __init__(self, inner_value: _NumberType) -> None:
...         super().__init__(inner_value)
...
...     def map(  # This method is required by Mappable
...         self,
...         function: Callable[[_NumberType], _NewNumberType]
...     ) -> 'Number[_NewNumberType]':
...         return Number(function(self._inner_value))

With our Number mappable class we can compose easily math functions with it.

>>> def my_math_function(number: int) -> int:
...     return number - 1

>>> number: Number[int] = Number(-41)
>>> assert number.map(my_math_function).map(abs) == Number(42)

Laws

To make sure your mappable implementation is right, you can apply the Mappable laws on it to test.

  1. Identity Law: When we pass the identity function to the map method, the mappable has to be the same, unaltered.

>>> from returns.functions import identity

>>> mappable_number: Number[int] = Number(1)
>>> assert mappable_number.map(identity) == Number(1)
  1. Associative Law: Given two functions, x and y, calling the map method with x function and after that calling with y function must have the same result if we compose them together.

>>> from returns.functions import compose

>>> def add_one(number: int) -> int:
...     return number + 1

>>> def multiply_by_ten(number: int) -> int:
...     return number * 10

>>> mappable_number: Number[int] = Number(9)
>>> assert mappable_number.map(
...    add_one,
... ).map(
...    multiply_by_ten,
... ) == mappable_number.map(
...     compose(add_one, multiply_by_ten),
... )

Bindable

Bindable is something that we can bind with a function. Like Maybe, so BindableN interface will help us to create our custom bindable.

>>> from dataclasses import dataclass
>>> from typing import Any, Callable, TypeVar

>>> from returns.interfaces.bindable import Bindable1
>>> from returns.primitives.hkt import SupportsKind1
>>> from returns.primitives.container import BaseContainer

>>> _BagContentType = TypeVar('_BagContentType')
>>> _NewBagContentType = TypeVar('_NewBagContentType')

>>> class Bag(
...     BaseContainer,
...     SupportsKind1['Bag', int],
...     Bindable1[_BagContentType],
... ):
...     def __init__(self, inner_value: _BagContentType) -> None:
...         super().__init__(inner_value)
...
...     def bind(
...         self,
...         function: Callable[[_BagContentType], 'Bag[_NewBagContentType]']
...     ) -> 'Bag[_NewBagContentType]':
...         return function(self._inner_value)

>>> @dataclass
... class Peanuts(object):
...     quantity: int

>>> def get_half(peanuts: Peanuts) -> Bag[Peanuts]:
...     return Bag(Peanuts(peanuts.quantity // 2))

>>> bag_of_peanuts: Bag[Peanuts] = Bag(Peanuts(10))
>>> assert bag_of_peanuts.bind(get_half) == Bag(Peanuts(5))

Applicative

Laws

Container

Laws

To make sure other people will be able to use your implementation, it should respect three new laws.

  1. Left Identity: If we bind a function to our bindable must have to be the same result as passing the value directly to the function.

>>> def can_be_bound(value: int) -> Bag[Peanuts]:
...     return Bag(Peanuts(value))

>>> assert Bag(5).bind(can_be_bound) == can_be_bound(5)
  1. Right Identity: If we pass the bindable constructor through bind must have to be the same result as instantiating the bindable on our own.

>>> bag = Bag(Peanuts(2))
>>> assert bag.bind(Bag) == Bag(Peanuts(2))
  1. Associative Law: Given two functions, x and y, calling the bind method with x function and after that calling with y function must have the same result if we bind with a function that passes the value to x and then bind the result with y.

>>> def minus_one(peanuts: Peanuts) -> Bag[Peanuts]:
...     return Bag(Peanuts(peanuts.quantity - 1))

>>> def half(peanuts: Peanuts) -> Bag[Peanuts]:
...     return Bag(Peanuts(peanuts.quantity // 2))

>>> bag = Bag(Peanuts(9))
>>> assert bag.bind(minus_one).bind(half) == bag.bind(
...    lambda value: minus_one(value).bind(half),
... )

More!

We have way more interfaces with different features! We have covered all of them in the technical docs.

So, use them to enforce type-safety of your own containers.

Specific interfaces

We also have a whole package of different specific interfaces that will help you to create containers based on our internal types, like Result.

FAQ

Why do you have general and specific interfaces?

We have .intrefaces.* types that can be applied to any possible type. There’s nothing they know about other types or returns package.

We also have a special .interfaces.specific package where we have types that know about other types in returns.

For example, MappableN from .interfaces only knows about .map method. It does not require anything else.

But, ResultLikeN from .interfaces.specific.result does require to have .bind_result method which relies on our Result type.

That’s the only difference. Build your own types with any of those interfaces.

Why some interfaces do not have type alias for 1 or 2 type arguments?

Some types like ResultLikeN do not have type aliases for one type argument in a form of ResultLike1.

Why does Mappable1 exists and ResultLike1 does not?

Because Mappable1 does make sense. But, ResultLike1 requiers at least two (value and error) types to exist. The same applies for ReaderLike1 and ReaderResultLike1 and ReaderResultLike2.

We don’t support type aliases for types that won’t make sence.

What’s the difference between MappableN and BindableN?

While MappableN you have to pass a pure function, like:

>>> def can_be_mapped(string: str) -> str:
...     return string

with Bindable we have to pass a function that returns another container:

>>> from returns.maybe import Maybe

>>> def can_be_bound(string: str) -> Maybe[str]:
...     return Some(string + '!')

The main difference is the return type. The consequence of this is big! BindableN allows to change the container type. While MappableN cannot do that.

So, Some.bind(function) can be evaluated to both Some and Nothing. While Some.map(function) will always stay as Some.

What is the difference between ResultLikeN and ResultBasedN?

ResultLikeN is just an intention of having a result (e.g. FutureResult), it’s not the result yet. While ResultBasedN is a concret result (e.g. IOResult), it’s has the desired result value.

Because of this difference between them is why we can’t unwrap a ResultLikeN container, it does not have the real result yet.

See the example below using FutureResult to get a IOResult:

>>> import anyio
>>> from returns.future import FutureResult
>>> from returns.interfaces.specific.future_result import FutureResultBasedN
>>> from returns.interfaces.specific.ioresult import (
...    IOResultBasedN,
...    IOResultLikeN,
... )
>>> from returns.interfaces.specific.result import ResultLikeN, ResultBasedN
>>> from returns.io import IOSuccess, IOResult
>>> from returns.result import Success, Result

>>> async def coro(arg: int) -> Result[int, str]:
...     return Success(arg + 1)

>>> # `result_like` does not have the result we want (Result[int, str])
>>> # it's just the intention of having one,
>>> # we have to await it to get the real result
>>> result_like: FutureResult[int, str] = FutureResult(coro(1))
>>> assert isinstance(result_like, FutureResultBasedN)
>>> assert isinstance(result_like, IOResultLikeN)
>>> assert isinstance(result_like, ResultLikeN)

>>> # `anyio.run(...)` will await our coroutine and give the real result to us
>>> result: IOResult[int, str] = anyio.run(result_like.awaitable)
>>> assert isinstance(result, IOResultBasedN)
>>> assert isinstance(result, ResultLikeN)

>>> # Compare it with the real result:
>>> assert isinstance(Success(1), ResultBasedN)

Note

The same difference applies to all *ResultLikeN vs *ResultBasedN (e.g. IOResultLikeN and IOResultBasedN)

API Reference

SupportsEquality

graph TD; SupportsEquality _LawSpec LawSpecDef --> _LawSpec Lawful --> SupportsEquality
class _LawSpec[source]

Bases: returns.primitives.laws.LawSpecDef

Equality laws.

Description: https://bit.ly/34D40iT

static reflexive_law(first)[source]

Value should be equal to itself.

Parameters

first (~_EqualType) –

Return type

None

static symmetry_law(first, second)[source]

If A == B then B == A.

Parameters
  • first (~_EqualType) –

  • second (~_EqualType) –

Return type

None

static transitivity_law(first, second, third)[source]

If A == B and B == C then A == C.

Parameters
  • first (~_EqualType) –

  • second (~_EqualType) –

  • third (~_EqualType) –

Return type

None

class SupportsEquality(*args, **kwds)[source]

Bases: returns.primitives.laws.Lawful

Interface for types that can be compared with real values.

Not all types can, because some don’t have the value at a time: - Future has to be awaited to get the value - Reader has to be called to get the value

_laws: ClassVar[Sequence[returns.primitives.laws.Law]] = (<returns.primitives.laws.Law1 object>, <returns.primitives.laws.Law2 object>, <returns.primitives.laws.Law3 object>)
abstract equals(other)[source]

Type-safe equality check for values of the same type.

Parameters
  • self (~_EqualType) –

  • other (~_EqualType) –

Return type

bool

Mappable

graph TD; MappableN _LawSpec LawSpecDef --> _LawSpec Lawful --> MappableN
class _LawSpec[source]

Bases: returns.primitives.laws.LawSpecDef

Mappable or functor laws.

https://en.wikibooks.org/wiki/Haskell/The_Functor_class#The_functor_laws

static identity_law(mappable)[source]

Mapping identity over a value must return the value unchanged.

Parameters

mappable (MappableN[~_FirstType, ~_SecondType, ~_ThirdType]) –

Return type

None

static associative_law(mappable, first, second)[source]

Mapping twice or mapping a composition is the same thing.

Parameters
  • mappable (MappableN[~_FirstType, ~_SecondType, ~_ThirdType]) –

  • first (Callable[[~_FirstType], ~_NewType1]) –

  • second (Callable[[~_NewType1], ~_NewType2]) –

Return type

None

class MappableN(*args, **kwds)[source]

Bases: returns.primitives.laws.Lawful

Allows to chain wrapped values in containers with regular functions.

Behaves like a functor.

_laws: ClassVar[Sequence[returns.primitives.laws.Law]] = (<returns.primitives.laws.Law1 object>, <returns.primitives.laws.Law3 object>)
abstract map(function)[source]

Allows to run a pure function over a container.

Parameters
  • self (~_MappableType) –

  • function (Callable[[~_FirstType], ~_UpdatedType]) –

Return type

KindN[~_MappableType, ~_UpdatedType, ~_SecondType, ~_ThirdType]

Mappable1

Type alias for kinds with one type argument.

alias of returns.interfaces.mappable.MappableN[_FirstType, NoReturn, NoReturn]

Mappable2

Type alias for kinds with two type arguments.

alias of returns.interfaces.mappable.MappableN[_FirstType, _SecondType, NoReturn]

Mappable3

Type alias for kinds with three type arguments.

alias of returns.interfaces.mappable.MappableN[_FirstType, _SecondType, _ThirdType]

Bindable

graph TD; BindableN Generic --> BindableN
class BindableN(*args, **kwds)[source]

Bases: typing.Generic

Represents a “context” in which calculations can be executed.

Bindable allows you to bind together a series of calculations while maintaining the context of that specific container.

In contrast to returns.interfaces.rescuable.RescuableN, works with the first type argument.

abstract bind(function)[source]

Applies ‘function’ to the result of a previous calculation.

And returns a new container.

Parameters
  • self (~_BindableType) –

  • function (Callable[[~_FirstType], KindN[~_BindableType, ~_UpdatedType, ~_SecondType, ~_ThirdType]]) –

Return type

KindN[~_BindableType, ~_UpdatedType, ~_SecondType, ~_ThirdType]

Bindable1

Type alias for kinds with one type argument.

alias of returns.interfaces.bindable.BindableN[_FirstType, NoReturn, NoReturn]

Bindable2

Type alias for kinds with two type arguments.

alias of returns.interfaces.bindable.BindableN[_FirstType, _SecondType, NoReturn]

Bindable3

Type alias for kinds with three type arguments.

alias of returns.interfaces.bindable.BindableN[_FirstType, _SecondType, _ThirdType]

Applicative

graph TD; ApplicativeN _LawSpec LawSpecDef --> _LawSpec MappableN --> ApplicativeN Lawful --> ApplicativeN
class _LawSpec[source]

Bases: returns.primitives.laws.LawSpecDef

Applicative mappable laws.

Definition: https://bit.ly/3hC8F8E Discussion: https://bit.ly/3jffz3L

static identity_law(container)[source]

Identity law.

If we apply wrapped identity function to a container, nothing happens.

Parameters

container (ApplicativeN[~_FirstType, ~_SecondType, ~_ThirdType]) –

Return type

None

static interchange_law(raw_value, container, function)[source]

Interchange law.

Basically we check that we can start our composition with both raw_value and function.

Great explanation: https://stackoverflow.com/q/27285918/4842742

Parameters
  • raw_value (~_FirstType) –

  • container (ApplicativeN[~_FirstType, ~_SecondType, ~_ThirdType]) –

  • function (Callable[[~_FirstType], ~_NewType1]) –

Return type

None

static homomorphism_law(raw_value, container, function)[source]

Homomorphism law.

The homomorphism law says that applying a wrapped function to a wrapped value is the same as applying the function to the value in the normal way and then using .from_value on the result.

Parameters
  • raw_value (~_FirstType) –

  • container (ApplicativeN[~_FirstType, ~_SecondType, ~_ThirdType]) –

  • function (Callable[[~_FirstType], ~_NewType1]) –

Return type

None

static composition_law(container, first, second)[source]

Composition law.

Apply two functions twice is the same as applying their composition once.

Parameters
  • container (ApplicativeN[~_FirstType, ~_SecondType, ~_ThirdType]) –

  • first (Callable[[~_FirstType], ~_NewType1]) –

  • second (Callable[[~_NewType1], ~_NewType2]) –

Return type

None

class ApplicativeN(*args, **kwds)[source]

Bases: returns.interfaces.mappable.MappableN, returns.primitives.laws.Lawful

Allows to create unit containers from raw values and to apply wrapped funcs.

_laws: ClassVar[Sequence[returns.primitives.laws.Law]] = (<returns.primitives.laws.Law1 object>, <returns.primitives.laws.Law3 object>, <returns.primitives.laws.Law3 object>, <returns.primitives.laws.Law3 object>)
abstract apply(container)[source]

Allows to apply a wrapped function over a container.

Parameters
  • self (~_ApplicativeType) –

  • container (KindN[~_ApplicativeType, Callable[[~_FirstType], ~_UpdatedType], ~_SecondType, ~_ThirdType]) –

Return type

KindN[~_ApplicativeType, ~_UpdatedType, ~_SecondType, ~_ThirdType]

abstract classmethod from_value(inner_value)[source]

Unit method to create new containers from any raw value.

Parameters
  • cls (Type[~_ApplicativeType]) –

  • inner_value (~_UpdatedType) –

Return type

KindN[~_ApplicativeType, ~_UpdatedType, ~_SecondType, ~_ThirdType]

Applicative1

Type alias for kinds with one type argument.

alias of returns.interfaces.applicative.ApplicativeN[_FirstType, NoReturn, NoReturn]

Applicative2

Type alias for kinds with two type arguments.

alias of returns.interfaces.applicative.ApplicativeN[_FirstType, _SecondType, NoReturn]

Applicative3

Type alias for kinds with three type arguments.

alias of returns.interfaces.applicative.ApplicativeN[_FirstType, _SecondType, _ThirdType]

Altable

graph TD; _LawSpec AltableN LawSpecDef --> _LawSpec Lawful --> AltableN
class _LawSpec[source]

Bases: returns.primitives.laws.LawSpecDef

Mappable or functor laws.

https://en.wikibooks.org/wiki/Haskell/The_Functor_class#The_functor_laws

static identity_law(altable)[source]

Mapping identity over a value must return the value unchanged.

Parameters

altable (AltableN[~_FirstType, ~_SecondType, ~_ThirdType]) –

Return type

None

static associative_law(altable, first, second)[source]

Mapping twice or mapping a composition is the same thing.

Parameters
  • altable (AltableN[~_FirstType, ~_SecondType, ~_ThirdType]) –

  • first (Callable[[~_SecondType], ~_NewType1]) –

  • second (Callable[[~_NewType1], ~_NewType2]) –

Return type

None

class AltableN(*args, **kwds)[source]

Bases: returns.primitives.laws.Lawful

Modifies the second type argument with a pure function.

_laws: ClassVar[Sequence[returns.primitives.laws.Law]] = (<returns.primitives.laws.Law1 object>, <returns.primitives.laws.Law3 object>)
abstract alt(function)[source]

Allows to run a pure function over a container.

Parameters
  • self (~_AltableType) –

  • function (Callable[[~_SecondType], ~_UpdatedType]) –

Return type

KindN[~_AltableType, ~_FirstType, ~_UpdatedType, ~_ThirdType]

Altable2

Type alias for kinds with two type arguments.

alias of returns.interfaces.altable.AltableN[_FirstType, _SecondType, NoReturn]

Altable3

Type alias for kinds with three type arguments.

alias of returns.interfaces.altable.AltableN[_FirstType, _SecondType, _ThirdType]

BiMappable

graph TD; BiMappableN MappableN --> BiMappableN AltableN --> BiMappableN
class BiMappableN(*args, **kwds)[source]

Bases: returns.interfaces.mappable.MappableN, returns.interfaces.altable.AltableN

Allows to change both types of a container at the same time.

Uses .map to change first type and .alt to change second type.

BiMappable2

Type alias for kinds with two type arguments.

alias of returns.interfaces.bimappable.BiMappableN[_FirstType, _SecondType, NoReturn]

BiMappable3

Type alias for kinds with three type arguments.

alias of returns.interfaces.bimappable.BiMappableN[_FirstType, _SecondType, _ThirdType]

Rescuable

graph TD; RescuableN Generic --> RescuableN
class RescuableN(*args, **kwds)[source]

Bases: typing.Generic

Represents a “context” in which calculations can be executed.

Rescueable allows you to bind together a series of calculations while maintaining the context of that specific container.

In contrast to returns.interfaces.bindable.BinbdaleN, works with the second type value.

abstract rescue(function)[source]

Applies ‘function’ to the result of a previous calculation.

And returns a new container.

Parameters
  • self (~_RescuableType) –

  • function (Callable[[~_SecondType], KindN[~_RescuableType, ~_FirstType, ~_UpdatedType, ~_ThirdType]]) –

Return type

KindN[~_RescuableType, ~_FirstType, ~_UpdatedType, ~_ThirdType]

Rescuable2

Type alias for kinds with two type arguments.

alias of returns.interfaces.rescuable.RescuableN[_FirstType, _SecondType, NoReturn]

Rescuable3

Type alias for kinds with three type arguments.

alias of returns.interfaces.rescuable.RescuableN[_FirstType, _SecondType, _ThirdType]

Unwrappable

graph TD; Unwrappable Generic --> Unwrappable
class Unwrappable(*args, **kwds)[source]

Bases: typing.Generic

Represents containers that can unwrap and return its wrapped value.

There are no aliases or UnwrappableN for Unwrappable interface. Because it always uses two and just two types.

Not all types can be Unwrappable because we do require to raise UnwrapFailedError if unwrap is not possible.

abstract unwrap()[source]

Custom magic method to unwrap inner value from container.

Should be redefined for ones that actually have values. And for ones that raise an exception for no values.

Note

As a part of the contract, failed unwrap calls must raise returns.primitives.excetion.UnwrapFailedError exception.

This method is the opposite of failure().

Parameters

self (~_UnwrappableType) –

Return type

~_FirstType

abstract failure()[source]

Custom magic method to unwrap inner value from the failed container.

Note

As a part of the contract, failed failure calls must raise returns.primitives.excetion.UnwrapFailedError exception.

This method is the opposite of unwrap().

Parameters

self (~_UnwrappableType) –

Return type

~_SecondType

Iterable

graph TD; IterableN Generic --> IterableN
class IterableN(*args, **kwds)[source]

Bases: typing.Generic

Allows to work with iterables of containers.

Converts Iterable[Container[...]] to Container[Sequence[...]]

abstract classmethod from_iterable(inner_value, strategy)[source]

Unit method to create a new container from iterable of containers.

Parameters
  • cls (Type[~_IterableType]) –

  • inner_value (Iterable[KindN[~_IterableType, ~_NewFirstType, ~_NewSecondType, ~_NewThirdType]]) –

  • strategy (Type[BaseIterableStrategyN[~_NewFirstType, ~_NewSecondType, ~_NewThirdType]]) –

Return type

KindN[~_IterableType, Sequence[~_NewFirstType], ~_NewSecondType, ~_NewThirdType]

Iterable1

Type alias for kinds with one type argument.

alias of returns.interfaces.iterable.IterableN[_FirstType, NoReturn, NoReturn]

Iterable2

Type alias for kinds with two type arguments.

alias of returns.interfaces.iterable.IterableN[_FirstType, _SecondType, NoReturn]

Iterable3

Type alias for kinds with three type arguments.

alias of returns.interfaces.iterable.IterableN[_FirstType, _SecondType, _ThirdType]

Container

graph TD; _LawSpec ContainerN LawSpecDef --> _LawSpec ApplicativeN --> ContainerN BindableN --> ContainerN IterableN --> ContainerN Lawful --> ContainerN
class _LawSpec[source]

Bases: returns.primitives.laws.LawSpecDef

Container laws.

Definition: https://wiki.haskell.org/Monad_laws Good explanation: https://bit.ly/2Qsi5re

static left_identity_law(raw_value, container, function)[source]

Left identity.

The first law states that if we take a value, put it in a default context with return and then feed it to a function by using bind, it’s the same as just taking the value and applying the function to it.

Parameters
  • raw_value (~_FirstType) –

  • container (ContainerN[~_FirstType, ~_SecondType, ~_ThirdType]) –

  • function (Callable[[~_FirstType], KindN[ContainerN, ~_NewType1, ~_SecondType, ~_ThirdType]]) –

Return type

None

static right_identity_law(container)[source]

Right identity.

The second law states that if we have a container value and we use bind to feed it to .from_value, the result is our original container value.

Parameters

container (ContainerN[~_FirstType, ~_SecondType, ~_ThirdType]) –

Return type

None

static associative_law(container, first, second)[source]

Associativity law.

The final monad law says that when we have a chain of container functions applications with bind, it shouldn’t matter how they’re nested.

Parameters
  • container (ContainerN[~_FirstType, ~_SecondType, ~_ThirdType]) –

  • first (Callable[[~_FirstType], KindN[ContainerN, ~_NewType1, ~_SecondType, ~_ThirdType]]) –

  • second (Callable[[~_NewType1], KindN[ContainerN, ~_NewType2, ~_SecondType, ~_ThirdType]]) –

Return type

None

class ContainerN(*args, **kwds)[source]

Bases: returns.interfaces.applicative.ApplicativeN, returns.interfaces.bindable.BindableN, returns.interfaces.iterable.IterableN, returns.primitives.laws.Lawful

Handy alias for types with .bind, .map, and .apply methods.

Should be a base class for almost any containers you write.

_laws: ClassVar[Sequence[returns.primitives.laws.Law]] = (<returns.primitives.laws.Law3 object>, <returns.primitives.laws.Law1 object>, <returns.primitives.laws.Law3 object>)
Container1

Type alias for kinds with one type argument.

alias of returns.interfaces.container.ContainerN[_FirstType, NoReturn, NoReturn]

Container2

Type alias for kinds with two type arguments.

alias of returns.interfaces.container.ContainerN[_FirstType, _SecondType, NoReturn]

Container3

Type alias for kinds with three type arguments.

alias of returns.interfaces.container.ContainerN[_FirstType, _SecondType, _ThirdType]

Maybe specific

graph TD; MaybeBasedN _LawSpec MaybeLikeN LawSpecDef --> _LawSpec ContainerN --> MaybeLikeN RescuableN --> MaybeLikeN Lawful --> MaybeLikeN MaybeLikeN --> MaybeBasedN Unwrappable --> MaybeBasedN SupportsEquality --> MaybeBasedN
class _LawSpec[source]

Bases: returns.primitives.laws.LawSpecDef

Maybe laws.

We need to be sure that .map, .bind, .bind_optional, and .rescue works correctly for both successful and failed types.

static map_short_circuit_law(container, function)[source]

Ensures that you cannot map from failures.

Parameters
  • container (MaybeLikeN[~_FirstType, ~_SecondType, ~_ThirdType]) –

  • function (Callable[[~_FirstType], ~_NewType1]) –

Return type

None

static bind_short_circuit_law(container, function)[source]

Ensures that you cannot bind from failures.

Parameters
  • container (MaybeLikeN[~_FirstType, ~_SecondType, ~_ThirdType]) –

  • function (Callable[[~_FirstType], KindN[MaybeLikeN, ~_NewType1, ~_SecondType, ~_ThirdType]]) –

Return type

None

static bind_optional_short_circuit_law(container, function)[source]

Ensures that you cannot bind from failures.

Parameters
  • container (MaybeLikeN[~_FirstType, ~_SecondType, ~_ThirdType]) –

  • function (Callable[[~_FirstType], Optional[~_NewType1]]) –

Return type

None

static rescue_short_circuit_law(raw_value, container, function)[source]

Ensures that you cannot rescue a success.

Parameters
  • raw_value (~_FirstType) –

  • container (MaybeLikeN[~_FirstType, ~_SecondType, ~_ThirdType]) –

  • function (Callable[[~_SecondType], KindN[MaybeLikeN, ~_FirstType, ~_NewType1, ~_ThirdType]]) –

Return type

None

static unit_structure_law(container, function)[source]

Ensures None is treated specially.

Parameters
  • container (MaybeLikeN[~_FirstType, ~_SecondType, ~_ThirdType]) –

  • function (Callable[[~_FirstType], None]) –

Return type

None

class MaybeLikeN(*args, **kwds)[source]

Bases: returns.interfaces.container.ContainerN, returns.interfaces.rescuable.RescuableN, returns.primitives.laws.Lawful

Type for values that do look like a Maybe.

For example, RequiresContextMaybe should be created from this interface. Cannot be unwrapped or compared.

_laws: ClassVar[Sequence[returns.primitives.laws.Law]] = (<returns.primitives.laws.Law2 object>, <returns.primitives.laws.Law2 object>, <returns.primitives.laws.Law2 object>, <returns.primitives.laws.Law3 object>, <returns.primitives.laws.Law2 object>)
abstract bind_optional(function)[source]

Binds a function that returns Optional values.

Parameters
  • self (~_MaybeLikeType) –

  • function (Callable[[~_FirstType], Optional[~_UpdatedType]]) –

Return type

KindN[~_MaybeLikeType, ~_UpdatedType, ~_SecondType, ~_ThirdType]

abstract classmethod from_optional(inner_value)[source]

Unit method to create containers from Optional value.

Parameters
  • cls (Type[~_MaybeLikeType]) –

  • inner_value (Optional[~_ValueType]) –

Return type

KindN[~_MaybeLikeType, ~_ValueType, ~_SecondType, ~_ThirdType]

MaybeLike2

Type alias for kinds with two type arguments.

alias of returns.interfaces.specific.maybe.MaybeLikeN[_FirstType, _SecondType, NoReturn]

MaybeLike3

Type alias for kinds with three type arguments.

alias of returns.interfaces.specific.maybe.MaybeLikeN[_FirstType, _SecondType, _ThirdType]

class MaybeBasedN(*args, **kwds)[source]

Bases: returns.interfaces.specific.maybe.MaybeLikeN, returns.interfaces.unwrappable.Unwrappable, returns.interfaces.equable.SupportsEquality

Concrete interface for Maybe type.

Can be unwrapped and compared.

abstract or_else_call(function)[source]

Calls a function in case there nothing to unwrap.

Parameters

function (Callable[[], ~_ValueType]) –

Return type

Union[~_FirstType, ~_ValueType]

MaybeBased2

Type alias for kinds with two type arguments.

alias of returns.interfaces.specific.maybe.MaybeBasedN[_FirstType, _SecondType, NoReturn]

MaybeBased3

Type alias for kinds with three type arguments.

alias of returns.interfaces.specific.maybe.MaybeBasedN[_FirstType, _SecondType, _ThirdType]

Result specific

graph TD; UnwrappableResult ResultLikeN ResultBasedN _LawSpec LawSpecDef --> _LawSpec ContainerN --> ResultLikeN BiMappableN --> ResultLikeN RescuableN --> ResultLikeN Lawful --> ResultLikeN ResultLikeN --> UnwrappableResult Unwrappable --> UnwrappableResult SupportsEquality --> UnwrappableResult UnwrappableResult --> ResultBasedN

An interface that represents a pure computation result.

For impure result see returns.interfaces.specific.ioresult.IOResultLikeN type.

class _LawSpec[source]

Bases: returns.primitives.laws.LawSpecDef

Result laws.

We need to be sure that .map, .bind, .alt, and .rescue works correctly for both success and failure types.

static map_short_circuit_law(raw_value, container, function)[source]

Ensures that you cannot map a failure.

Parameters
  • raw_value (~_SecondType) –

  • container (ResultLikeN[~_FirstType, ~_SecondType, ~_ThirdType]) –

  • function (Callable[[~_FirstType], ~_NewType1]) –

Return type

None

static bind_short_circuit_law(raw_value, container, function)[source]

Ensures that you cannot bind a failure.

See: https://wiki.haskell.org/Typeclassopedia#MonadFail

Parameters
  • raw_value (~_SecondType) –

  • container (ResultLikeN[~_FirstType, ~_SecondType, ~_ThirdType]) –

  • function (Callable[[~_FirstType], KindN[ResultLikeN, ~_NewType1, ~_SecondType, ~_ThirdType]]) –

Return type

None

static alt_short_circuit_law(raw_value, container, function)[source]

Ensures that you cannot alt a success.

Parameters
  • raw_value (~_SecondType) –

  • container (ResultLikeN[~_FirstType, ~_SecondType, ~_ThirdType]) –

  • function (Callable[[~_SecondType], ~_NewType1]) –

Return type

None

static rescue_short_circuit_law(raw_value, container, function)[source]

Ensures that you cannot rescue a success.

Parameters
  • raw_value (~_FirstType) –

  • container (ResultLikeN[~_FirstType, ~_SecondType, ~_ThirdType]) –

  • function (Callable[[~_SecondType], KindN[ResultLikeN, ~_FirstType, ~_NewType1, ~_ThirdType]]) –

Return type

None

class ResultLikeN(*args, **kwds)[source]

Bases: returns.interfaces.container.ContainerN, returns.interfaces.bimappable.BiMappableN, returns.interfaces.rescuable.RescuableN, returns.primitives.laws.Lawful

Base types for types that looks like Result but cannot be unwrapped.

Like RequiresContextResult or FutureResult.

_laws: ClassVar[Sequence[returns.primitives.laws.Law]] = (<returns.primitives.laws.Law3 object>, <returns.primitives.laws.Law3 object>, <returns.primitives.laws.Law3 object>, <returns.primitives.laws.Law3 object>)
abstract swap()[source]

Swaps value and error types in Result.

Parameters

self (~_ResultLikeType) –

Return type

KindN[~_ResultLikeType, ~_SecondType, ~_FirstType, ~_ThirdType]

abstract bind_result(function)[source]

Runs Result returning function over a container.

Parameters
  • self (~_ResultLikeType) –

  • function (Callable[[~_FirstType], ForwardRef]) –

Return type

KindN[~_ResultLikeType, ~_UpdatedType, ~_SecondType, ~_ThirdType]

abstract classmethod from_result(inner_value)[source]

Unit method to create new containers from any raw value.

Parameters
  • cls (Type[~_ResultLikeType]) –

  • inner_value (Result[_ValueType, _ErrorType]) –

Return type

KindN[~_ResultLikeType, ~_ValueType, ~_ErrorType, ~_ThirdType]

abstract classmethod from_failure(inner_value)[source]

Unit method to create new containers from any raw value.

Parameters
  • cls (Type[~_ResultLikeType]) –

  • inner_value (~_ErrorType) –

Return type

KindN[~_ResultLikeType, ~_FirstType, ~_ErrorType, ~_ThirdType]

ResultLike2

Type alias for kinds with two type arguments.

alias of returns.interfaces.specific.result.ResultLikeN[_FirstType, _SecondType, NoReturn]

ResultLike3

Type alias for kinds with three type arguments.

alias of returns.interfaces.specific.result.ResultLikeN[_FirstType, _SecondType, _ThirdType]

class UnwrappableResult(*args, **kwds)[source]

Bases: returns.interfaces.specific.result.ResultLikeN, returns.interfaces.unwrappable.Unwrappable, returns.interfaces.equable.SupportsEquality

Intermediate type with 5 type arguments that represents unwrappable result.

It is a raw type and should not be used directly. Use ResultBasedN and IOResultBasedN instead.

class ResultBasedN(*args, **kwds)[source]

Bases: returns.interfaces.specific.result.UnwrappableResult

Base type for real Result types.

Can be unwrapped.

ResultBased2

Type alias for kinds with two type arguments.

alias of returns.interfaces.specific.result.ResultBasedN[_FirstType, _SecondType, NoReturn]

ResultBased3

Type alias for kinds with three type arguments.

alias of returns.interfaces.specific.result.ResultBasedN[_FirstType, _SecondType, _ThirdType]

IO specific

graph TD; IOBasedN IOLikeN ContainerN --> IOLikeN IOLikeN --> IOBasedN SupportsEquality --> IOBasedN
class IOLikeN(*args, **kwds)[source]

Bases: returns.interfaces.container.ContainerN

Represents interface for types that looks like fearless IO.

This type means that IO cannot fail. Like random numbers, date, etc. Don’t use this type for IO that can. Instead, use returns.interfaces.specific.ioresult.IOResultBasedN type.

abstract bind_io(function)[source]

Allows to apply a wrapped function over a container.

Parameters
  • self (~_IOLikeType) –

  • function (Callable[[~_FirstType], ForwardRef]) –

Return type

KindN[~_IOLikeType, ~_UpdatedType, ~_SecondType, ~_ThirdType]

abstract classmethod from_io(inner_value)[source]

Unit method to create new containers from successful IO.

Parameters
  • cls (Type[~_IOLikeType]) –

  • inner_value (IO[_UpdatedType]) –

Return type

KindN[~_IOLikeType, ~_UpdatedType, ~_SecondType, ~_ThirdType]

IOLike1

Type alias for kinds with one type argument.

alias of returns.interfaces.specific.io.IOLikeN[_FirstType, NoReturn, NoReturn]

IOLike2

Type alias for kinds with two type arguments.

alias of returns.interfaces.specific.io.IOLikeN[_FirstType, _SecondType, NoReturn]

IOLike3

Type alias for kinds with three type arguments.

alias of returns.interfaces.specific.io.IOLikeN[_FirstType, _SecondType, _ThirdType]

class IOBasedN(*args, **kwds)[source]

Bases: returns.interfaces.specific.io.IOLikeN, returns.interfaces.equable.SupportsEquality

Represents the base interface for types that do fearless IO.

This type means that IO cannot fail. Like random numbers, date, etc. Don’t use this type for IO that can. Instead, use returns.interfaces.specific.ioresult.IOResultBasedN type.

This interface also supports direct comparison of two values. While IOLikeN is different. It can be lazy and cannot be compared.

IOBased1

Type alias for kinds with one type argument.

alias of returns.interfaces.specific.io.IOBasedN[_FirstType, NoReturn, NoReturn]

IOBased2

Type alias for kinds with two type arguments.

alias of returns.interfaces.specific.io.IOBasedN[_FirstType, _SecondType, NoReturn]

IOBased3

Type alias for kinds with three type arguments.

alias of returns.interfaces.specific.io.IOBasedN[_FirstType, _SecondType, _ThirdType]

IOResult specific

graph TD; IOResultBasedN IOResultLikeN IOLikeN --> IOResultLikeN ResultLikeN --> IOResultLikeN IOResultLikeN --> IOResultBasedN IOBasedN --> IOResultBasedN UnwrappableResult --> IOResultBasedN

An interface for types that do IO and can fail.

It is a base interface for both sync and async IO stacks.

class IOResultLikeN(*args, **kwds)[source]

Bases: returns.interfaces.specific.io.IOLikeN, returns.interfaces.specific.result.ResultLikeN

Base type for types that look like IOResult but cannot be unwrapped.

Like FutureResult or RequiresContextIOResult.

abstract bind_ioresult(function)[source]

Runs IOResult returning function over a container.

Parameters
  • self (~_IOResultLikeType) –

  • function (Callable[[~_FirstType], ForwardRef]) –

Return type

KindN[~_IOResultLikeType, ~_UpdatedType, ~_SecondType, ~_ThirdType]

abstract compose_result(function)[source]

Allows to compose the unrelying Result with a function.

Parameters
  • self (~_IOResultLikeType) –

  • function (Callable[[ForwardRef], KindN[~_IOResultLikeType, ~_UpdatedType, ~_SecondType, ~_ThirdType]]) –

Return type

KindN[~_IOResultLikeType, ~_UpdatedType, ~_SecondType, ~_ThirdType]

abstract classmethod from_ioresult(inner_value)[source]

Unit method to create new containers from IOResult type.

Parameters
  • cls (Type[~_IOResultLikeType]) –

  • inner_value (IOResult[_ValueType, _ErrorType]) –

Return type

KindN[~_IOResultLikeType, ~_ValueType, ~_ErrorType, ~_ThirdType]

abstract classmethod from_failed_io(inner_value)[source]

Unit method to create new containers from failed IO.

Parameters
  • cls (Type[~_IOResultLikeType]) –

  • inner_value (IO[_ErrorType]) –

Return type

KindN[~_IOResultLikeType, ~_FirstType, ~_ErrorType, ~_ThirdType]

IOResultLike2

Type alias for kinds with two type arguments.

alias of returns.interfaces.specific.ioresult.IOResultLikeN[_FirstType, _SecondType, NoReturn]

IOResultLike3

Type alias for kinds with three type arguments.

alias of returns.interfaces.specific.ioresult.IOResultLikeN[_FirstType, _SecondType, _ThirdType]

class IOResultBasedN(*args, **kwds)[source]

Bases: returns.interfaces.specific.ioresult.IOResultLikeN, returns.interfaces.specific.io.IOBasedN, returns.interfaces.specific.result.UnwrappableResult

Base type for real IOResult types.

Can be unwrapped.

IOResultBased2

Type alias for kinds with two type arguments.

alias of returns.interfaces.specific.ioresult.IOResultBasedN[_FirstType, _SecondType, NoReturn]

IOResultBased3

Type alias for kinds with three type arguments.

alias of returns.interfaces.specific.ioresult.IOResultBasedN[_FirstType, _SecondType, _ThirdType]

Future specific

graph TD; FutureBasedN FutureLikeN AsyncFutureN IOLikeN --> FutureLikeN Generic --> AsyncFutureN FutureLikeN --> FutureBasedN AsyncFutureN --> FutureBasedN

Represents the base interfaces for types that do fearless async operations.

This type means that Future cannot fail. Don’t use this type for async that can. Instead, use returns.interfaces.specific.future_result.FutureResultBasedN type.

class FutureLikeN(*args, **kwds)[source]

Bases: returns.interfaces.specific.io.IOLikeN

Base type for ones that does look like Future.

But at the time this is not a real Future and cannot be awaited.

abstract bind_future(function)[source]

Allows to bind Future returning function over a container.

Parameters
  • self (~_FutureLikeType) –

  • function (Callable[[~_FirstType], ForwardRef]) –

Return type

KindN[~_FutureLikeType, ~_UpdatedType, ~_SecondType, ~_ThirdType]

abstract bind_async_future(function)[source]

Allows to bind async Future returning function over container.

Parameters
  • self (~_FutureLikeType) –

  • function (Callable[[~_FirstType], Awaitable[ForwardRef]]) –

Return type

KindN[~_FutureLikeType, ~_UpdatedType, ~_SecondType, ~_ThirdType]

abstract bind_async(function)[source]

Binds async function returning the same type of container.

Parameters
  • self (~_FutureLikeType) –

  • function (Callable[[~_FirstType], Awaitable[KindN[~_FutureLikeType, ~_UpdatedType, ~_SecondType, ~_ThirdType]]]) –

Return type

KindN[~_FutureLikeType, ~_UpdatedType, ~_SecondType, ~_ThirdType]

abstract bind_awaitable(function)[source]

Allows to bind async function over container.

Parameters
  • self (~_FutureLikeType) –

  • function (Callable[[~_FirstType], Awaitable[~_UpdatedType]]) –

Return type

KindN[~_FutureLikeType, ~_UpdatedType, ~_SecondType, ~_ThirdType]

abstract classmethod from_future(inner_value)[source]

Unit method to create new containers from successful Future.

Parameters
  • cls (Type[~_FutureLikeType]) –

  • inner_value (Future[_UpdatedType]) –

Return type

KindN[~_FutureLikeType, ~_UpdatedType, ~_SecondType, ~_ThirdType]

FutureLike1

Type alias for kinds with one type argument.

alias of returns.interfaces.specific.future.FutureLikeN[_FirstType, NoReturn, NoReturn]

FutureLike2

Type alias for kinds with two type arguments.

alias of returns.interfaces.specific.future.FutureLikeN[_FirstType, _SecondType, NoReturn]

FutureLike3

Type alias for kinds with three type arguments.

alias of returns.interfaces.specific.future.FutureLikeN[_FirstType, _SecondType, _ThirdType]

class AsyncFutureN(*args, **kwds)[source]

Bases: typing.Generic

Type that provides the required API for Future to be async.

Should not be used directly. Use FutureBasedN instead.

abstract async awaitable()[source]

Underling logic under await expression.

Parameters

self (~_AsyncFutureType) –

Return type

IOLikeN[~_FirstType, ~_SecondType, ~_ThirdType]

AsyncFuture1

Type alias for kinds with one type argument.

alias of returns.interfaces.specific.future.AsyncFutureN[_FirstType, NoReturn, NoReturn]

AsyncFuture2

Type alias for kinds with two type arguments.

alias of returns.interfaces.specific.future.AsyncFutureN[_FirstType, _SecondType, NoReturn]

AsyncFuture3

Type alias for kinds with three type arguments.

alias of returns.interfaces.specific.future.AsyncFutureN[_FirstType, _SecondType, _ThirdType]

class FutureBasedN(*args, **kwds)[source]

Bases: returns.interfaces.specific.future.FutureLikeN, returns.interfaces.specific.future.AsyncFutureN

Base type for real Future objects.

They can be awaited.

FutureBased1

Type alias for kinds with one type argument.

alias of returns.interfaces.specific.future.FutureBasedN[_FirstType, NoReturn, NoReturn]

FutureBased2

Type alias for kinds with two type arguments.

alias of returns.interfaces.specific.future.FutureBasedN[_FirstType, _SecondType, NoReturn]

FutureBased3

Type alias for kinds with three type arguments.

alias of returns.interfaces.specific.future.FutureBasedN[_FirstType, _SecondType, _ThirdType]

FutureResult specific

graph TD; FutureResultLikeN FutureResultBasedN FutureLikeN --> FutureResultLikeN IOResultLikeN --> FutureResultLikeN FutureBasedN --> FutureResultBasedN FutureResultLikeN --> FutureResultBasedN

Represents the base interfaces for types that do fear-some async operations.

This type means that FutureResult can (and will!) fail with exceptions.

Use this type to mark that this specific async opetaion can fail.

class FutureResultLikeN(*args, **kwds)[source]

Bases: returns.interfaces.specific.future.FutureLikeN, returns.interfaces.specific.ioresult.IOResultLikeN

Base type for ones that does look like FutureResult.

But at the time this is not a real Future and cannot be awaited. It is also cannot be unwrapped, because it is not a real IOResult.

abstract bind_future_result(function)[source]

Allows to bind FutureResult functions over a container.

Parameters
  • self (~_FutureResultLikeType) –

  • function (Callable[[~_FirstType], ForwardRef]) –

Return type

KindN[~_FutureResultLikeType, ~_UpdatedType, ~_SecondType, ~_ThirdType]

abstract bind_async_future_result(function)[source]

Allows to bind async FutureResult functions over container.

Parameters
  • self (~_FutureResultLikeType) –

  • function (Callable[[~_FirstType], Awaitable[ForwardRef]]) –

Return type

KindN[~_FutureResultLikeType, ~_UpdatedType, ~_SecondType, ~_ThirdType]

abstract classmethod from_failed_future(inner_value)[source]

Creates new container from a failed Future.

Parameters
  • cls (Type[~_FutureResultLikeType]) –

  • inner_value (Future[_ErrorType]) –

Return type

KindN[~_FutureResultLikeType, ~_FirstType, ~_ErrorType, ~_ThirdType]

classmethod from_future_result(inner_value)[source]

Creates container from FutureResult instance.

Parameters
  • cls (Type[~_FutureResultLikeType]) –

  • inner_value (FutureResult[_ValueType, _ErrorType]) –

Return type

KindN[~_FutureResultLikeType, ~_ValueType, ~_ErrorType, ~_ThirdType]

FutureResultLike2

Type alias for kinds with two type arguments.

alias of returns.interfaces.specific.future_result.FutureResultLikeN[_FirstType, _SecondType, NoReturn]

FutureResultLike3

Type alias for kinds with three type arguments.

alias of returns.interfaces.specific.future_result.FutureResultLikeN[_FirstType, _SecondType, _ThirdType]

class FutureResultBasedN(*args, **kwds)[source]

Bases: returns.interfaces.specific.future.FutureBasedN, returns.interfaces.specific.future_result.FutureResultLikeN

Base type for real FutureResult objects.

They can be awaited. Still cannot be unwrapped.

FutureResultBased2

Type alias for kinds with two type arguments.

alias of returns.interfaces.specific.future_result.FutureResultBasedN[_FirstType, _SecondType, NoReturn]

FutureResultBased3

Type alias for kinds with three type arguments.

alias of returns.interfaces.specific.future_result.FutureResultBasedN[_FirstType, _SecondType, _ThirdType]

Reader specific

graph TD; _LawSpec CallableReader2 ReaderLike2 CallableReader3 CanBeCalled ReaderBased2 ReaderLike3 Generic --> CanBeCalled ContainerN --> ReaderLike2 ReaderLike2 --> CallableReader2 CanBeCalled --> CallableReader2 ContainerN --> ReaderLike3 ReaderLike3 --> CallableReader3 CanBeCalled --> CallableReader3 LawSpecDef --> _LawSpec CallableReader2 --> ReaderBased2 Lawful --> ReaderBased2

This module is special.

Reader does not produce ReaderLikeN interface as other containers.

Because Reader can be used with two or three type arguments: - RequiresContext[value, env] - RequiresContextResult[value, error, env]

Because the second type argument changes its meaning based on the used KindN instance, we need to have two separate interfaces for two separate use-cases: - ReaderLike2 is used for types where the second type argument is env - ReaderLike3 is used for types where the third type argument is env

We also have two methods and two poinfree helpers for bind_context composition: one for each interface.

Furthermore, Reader cannot have ReaderLike1 type, because we need both value and env types at all cases.

class CanBeCalled(*args, **kwds)[source]

Bases: typing.Generic

Special type we use as a base one for all callble Reader instances.

It only has a single method. And is a base type for every single one of them.

But, each Reader defines the return type differently. For example:

  • Reader has just _ReturnType

  • ReaderResult has Result[_FirstType, _SecondType]

  • ReaderIOResult has IOResult[_FirstType, _SecondType]

And so on.

class ReaderLike2(*args, **kwds)[source]

Bases: returns.interfaces.container.ContainerN

Reader interface for Kind2 based types.

It has two type arguments and treats the second type argument as env type.

abstract property empty

Is required to call Reader with explicit empty argument. :param self: :type self: ~_ReaderLike2Type

Return type

NoDeps

abstract bind_context(function)[source]

Allows to apply a wrapped function over a Reader container.

Parameters
  • self (~_ReaderLike2Type) –

  • function (Callable[[~_FirstType], ForwardRef]) –

Return type

KindN[~_ReaderLike2Type, ~_UpdatedType, ~_SecondType, Any]

abstract modify_env(function)[source]

Transforms the environment before calling the container.

Parameters
  • self (~_ReaderLike2Type) –

  • function (Callable[[~_UpdatedType], ~_SecondType]) –

Return type

KindN[~_ReaderLike2Type, ~_FirstType, ~_UpdatedType, Any]

abstract classmethod ask()[source]

Returns the depedencies inside the container.

Parameters

cls (Type[~_ReaderLike2Type]) –

Return type

KindN[~_ReaderLike2Type, ~_SecondType, ~_SecondType, Any]

abstract classmethod from_context(inner_value)[source]

Unit method to create new containers from successful Reader.

Parameters
  • cls (Type[~_ReaderLike2Type]) –

  • inner_value (RequiresContext[_ValueType, _EnvType]) –

Return type

KindN[~_ReaderLike2Type, ~_ValueType, ~_EnvType, Any]

class CallableReader2(*args, **kwds)[source]

Bases: returns.interfaces.specific.reader.ReaderLike2, returns.interfaces.specific.reader.CanBeCalled

Intermediate interface for ReaderLike2 + __call__ method.

Has 4 type variables to type Reader and __call__ independently. Since, we don’t have any other fancy ways of doing it.

Should not be used directly other than defining your own Reader interfaces.

class ReaderLike3(*args, **kwds)[source]

Bases: returns.interfaces.container.ContainerN

Reader interface for Kind3 based types.

It has three type arguments and treats the third type argument as env type. The second type argument is not used here.

abstract property empty

Is required to call Reader with explicit empty argument. :param self: :type self: ~_ReaderLike3Type

Return type

NoDeps

abstract bind_context(function)[source]

Allows to apply a wrapped function over a Reader container.

Parameters
  • self (~_ReaderLike3Type) –

  • function (Callable[[~_FirstType], ForwardRef]) –

Return type

KindN[~_ReaderLike3Type, ~_UpdatedType, ~_SecondType, ~_ThirdType]

abstract modify_env(function)[source]

Transforms the environment before calling the container.

Parameters
  • self (~_ReaderLike3Type) –

  • function (Callable[[~_UpdatedType], ~_ThirdType]) –

Return type

KindN[~_ReaderLike3Type, ~_FirstType, ~_SecondType, ~_UpdatedType]

abstract classmethod ask()[source]

Returns the depedencies inside the container.

Parameters

cls (Type[~_ReaderLike3Type]) –

Return type

KindN[~_ReaderLike3Type, ~_ThirdType, ~_SecondType, ~_ThirdType]

abstract classmethod from_context(inner_value)[source]

Unit method to create new containers from successful Reader.

Parameters
  • cls (Type[~_ReaderLike3Type]) –

  • inner_value (RequiresContext[_ValueType, _EnvType]) –

Return type

KindN[~_ReaderLike3Type, ~_ValueType, ~_SecondType, ~_EnvType]

class CallableReader3(*args, **kwds)[source]

Bases: returns.interfaces.specific.reader.ReaderLike3, returns.interfaces.specific.reader.CanBeCalled

Intermediate interface for ReaderLike3 + __call__ method.

Has 5 type variables to type Reader and __call__ independently. Since, we don’t have any other fancy ways of doing it.

Should not be used directly other than defining your own Reader interfaces.

class _LawSpec[source]

Bases: returns.primitives.laws.LawSpecDef

Concrete laws for ReaderBased2.

See: https://github.com/haskell/mtl/pull/61/files

static purity_law(container, env)[source]

Calling a Reader twice has the same result with the same env.

Parameters
  • container (ReaderBased2[~_FirstType, ~_SecondType]) –

  • env (~_SecondType) –

Return type

None

static asking_law(container, env)[source]

Asking for an env, always returns the env.

Parameters
  • container (ReaderBased2[~_FirstType, ~_SecondType]) –

  • env (~_SecondType) –

Return type

None

class ReaderBased2(*args, **kwds)[source]

Bases: returns.interfaces.specific.reader.CallableReader2, returns.primitives.laws.Lawful

This interface is very specific to our Reader type.

The only thing that differs from ReaderLike2 is that we know the specific types for its __call__ method.

_laws: ClassVar[Sequence[returns.primitives.laws.Law]] = (<returns.primitives.laws.Law2 object>, <returns.primitives.laws.Law2 object>)

ReaderResult specific

graph TD; ReaderResultLikeN _LawSpec ReaderResultBasedN ReaderLike3 --> ReaderResultLikeN ResultLikeN --> ReaderResultLikeN LawSpecDef --> _LawSpec ReaderResultLikeN --> ReaderResultBasedN CallableReader3 --> ReaderResultBasedN Lawful --> ReaderResultBasedN
class ReaderResultLikeN(*args, **kwds)[source]

Bases: returns.interfaces.specific.reader.ReaderLike3, returns.interfaces.specific.result.ResultLikeN

Base interface for all types that do look like ReaderResult instance.

Cannot be called.

abstract bind_context_result(function)[source]

Binds a ReaderResult returning function over a container.

Parameters
  • self (~_ReaderResultLikeType) –

  • function (Callable[[~_FirstType], ForwardRef]) –

Return type

KindN[~_ReaderResultLikeType, ~_UpdatedType, ~_SecondType, ~_ThirdType]

abstract classmethod from_failed_context(inner_value)[source]

Unit method to create new containers from failed Reader.

Parameters
  • cls (Type[~_ReaderResultLikeType]) –

  • inner_value (Reader[_ErrorType, _EnvType]) –

Return type

KindN[~_ReaderResultLikeType, ~_FirstType, ~_ErrorType, ~_EnvType]

abstract classmethod from_result_context(inner_value)[source]

Unit method to create new containers from ReaderResult.

Parameters
  • cls (Type[~_ReaderResultLikeType]) –

  • inner_value (ReaderResult[_ValueType, _ErrorType, _EnvType]) –

Return type

KindN[~_ReaderResultLikeType, ~_ValueType, ~_ErrorType, ~_EnvType]

ReaderResultLike3

Type alias for kinds with three type arguments.

alias of returns.interfaces.specific.reader_result.ReaderResultLikeN[_FirstType, _SecondType, _ThirdType]

class _LawSpec[source]

Bases: returns.primitives.laws.LawSpecDef

Concrete laws for ReaderResulBasedN.

See: https://github.com/haskell/mtl/pull/61/files

static purity_law(container, env)[source]

Calling a Reader twice has the same result with the same env.

Parameters
  • container (ReaderResultBasedN[~_FirstType, ~_SecondType, ~_ThirdType]) –

  • env (~_ThirdType) –

Return type

None

static asking_law(container, env)[source]

Asking for an env, always returns the env.

Parameters
  • container (ReaderResultBasedN[~_FirstType, ~_SecondType, ~_ThirdType]) –

  • env (~_ThirdType) –

Return type

None

class ReaderResultBasedN(*args, **kwds)[source]

Bases: returns.interfaces.specific.reader_result.ReaderResultLikeN, returns.interfaces.specific.reader.CallableReader3, returns.primitives.laws.Lawful

This interface is very specific to our ReaderResult type.

The only thing that differs from ReaderResultLikeN is that we know the specific types for its __call__ method.

In this case the return type of __call__ is Result.

_laws
ReaderResultBased3

Type alias for kinds with three type arguments.

alias of returns.interfaces.specific.reader_result.ReaderResultBasedN[_FirstType, _SecondType, _ThirdType]

ReaderIOResult specific

graph TD; ReaderIOResultBasedN _LawSpec ReaderIOResultLikeN ReaderResultLikeN --> ReaderIOResultLikeN IOResultLikeN --> ReaderIOResultLikeN LawSpecDef --> _LawSpec ReaderIOResultLikeN --> ReaderIOResultBasedN CallableReader3 --> ReaderIOResultBasedN Lawful --> ReaderIOResultBasedN
class ReaderIOResultLikeN(*args, **kwds)[source]

Bases: returns.interfaces.specific.reader_result.ReaderResultLikeN, returns.interfaces.specific.ioresult.IOResultLikeN

Base interface for all types that do look like ReaderIOResult instance.

Cannot be called.

abstract bind_context_ioresult(function)[source]

Binds a ReaderIOResult returning function over a container.

Parameters
  • self (~_ReaderIOResultLikeType) –

  • function (Callable[[~_FirstType], ForwardRef]) –

Return type

KindN[~_ReaderIOResultLikeType, ~_UpdatedType, ~_SecondType, ~_ThirdType]

abstract classmethod from_ioresult_context(inner_value)[source]

Unit method to create new containers from ReaderIOResult.

Parameters
  • cls (Type[~_ReaderIOResultLikeType]) –

  • inner_value (ReaderIOResult[_ValueType, _ErrorType, _EnvType]) –

Return type

KindN[~_ReaderIOResultLikeType, ~_ValueType, ~_ErrorType, ~_EnvType]

ReaderIOResultLike3

Type alias for kinds with three type arguments.

alias of returns.interfaces.specific.reader_ioresult.ReaderIOResultLikeN[_FirstType, _SecondType, _ThirdType]

class _LawSpec[source]

Bases: returns.primitives.laws.LawSpecDef

Concrete laws for ReaderIOResultBasedN.

See: https://github.com/haskell/mtl/pull/61/files

static asking_law(container, env)[source]

Asking for an env, always returns the env.

Parameters
  • container (ReaderIOResultBasedN[~_FirstType, ~_SecondType, ~_ThirdType]) –

  • env (~_ThirdType) –

Return type

None

class ReaderIOResultBasedN(*args, **kwds)[source]

Bases: returns.interfaces.specific.reader_ioresult.ReaderIOResultLikeN, returns.interfaces.specific.reader.CallableReader3, returns.primitives.laws.Lawful

This interface is very specific to our ReaderIOResult type.

The only thing that differs from ReaderIOResultLikeN is that we know the specific types for its __call__ method.

In this case the return type of __call__ is IOResult.

_laws
ReaderIOResultBased3

Type alias for kinds with three type arguments.

alias of returns.interfaces.specific.reader_ioresult.ReaderIOResultBasedN[_FirstType, _SecondType, _ThirdType]

ReaderFutureResult specific

graph TD; ReaderFutureResultBasedN ReaderFutureResultLikeN _LawSpec ReaderIOResultLikeN --> ReaderFutureResultLikeN FutureResultLikeN --> ReaderFutureResultLikeN LawSpecDef --> _LawSpec ReaderFutureResultLikeN --> ReaderFutureResultBasedN CallableReader3 --> ReaderFutureResultBasedN Lawful --> ReaderFutureResultBasedN
class ReaderFutureResultLikeN(*args, **kwds)[source]

Bases: returns.interfaces.specific.reader_ioresult.ReaderIOResultLikeN, returns.interfaces.specific.future_result.FutureResultLikeN

Interface for all types that do look like ReaderFutureResult instance.

Cannot be called.

abstract bind_context_future_result(function)[source]

Bind a ReaderFutureResult returning function over a container.

Parameters
  • self (~_ReaderFutureResultLikeType) –

  • function (Callable[[~_FirstType], ForwardRef]) –

Return type

KindN[~_ReaderFutureResultLikeType, ~_UpdatedType, ~_SecondType, ~_ThirdType]

abstract bind_async_context_future_result(function)[source]

Bind async ReaderFutureResult function.

Parameters
  • self (~_ReaderFutureResultLikeType) –

  • function (Callable[[~_FirstType], Awaitable[ForwardRef]]) –

Return type

KindN[~_ReaderFutureResultLikeType, ~_UpdatedType, ~_SecondType, ~_ThirdType]

abstract classmethod from_future_result_context(inner_value)[source]

Unit method to create new containers from ReaderFutureResult.

Parameters
  • cls (Type[~_ReaderFutureResultLikeType]) –

  • inner_value (ReaderFutureResult[_ValueType, _ErrorType, _EnvType]) –

Return type

KindN[~_ReaderFutureResultLikeType, ~_ValueType, ~_ErrorType, ~_EnvType]

ReaderFutureResultLike3

Type alias for kinds with three type arguments.

alias of returns.interfaces.specific.reader_future_result.ReaderFutureResultLikeN[_FirstType, _SecondType, _ThirdType]

class _LawSpec[source]

Bases: returns.primitives.laws.LawSpecDef

Concrete laws for ReaderFutureResultBasedN.

See: https://github.com/haskell/mtl/pull/61/files

static asking_law(container, env)[source]

Asking for an env, always returns the env.

Parameters
Return type

None

class ReaderFutureResultBasedN(*args, **kwds)[source]

Bases: returns.interfaces.specific.reader_future_result.ReaderFutureResultLikeN, returns.interfaces.specific.reader.CallableReader3, returns.primitives.laws.Lawful

This interface is very specific to our ReaderFutureResult type.

The only thing that differs from ReaderFutureResultLikeN is that we know the specific types for its __call__ method.

In this case the return type of __call__ is FutureResult.

_laws
ReaderFutureResultBased3

Type alias for kinds with three type arguments.

alias of returns.interfaces.specific.reader_future_result.ReaderFutureResultBasedN[_FirstType, _SecondType, _ThirdType]