View Source Witchcraft.Semigroupoid (Witchcraft v1.0.6-doma)

A semigroupoid describes some way of composing morphisms on between some collection of objects.

type-class

Type Class

An instance of Witchcraft.Semigroupoid must define Witchcraft.Semigroupoid.compose/2.

Semigroupoid  [compose/2]

Link to this section Summary

Functions

Composition operator "the pipe way". Alias for pipe_compose/2.

Express how to apply arguments to the very end of a semigroupoid, or "run the morphism". This should not be used to inject values part way though a composition chain.

Take two morphisms and return their composition "the math way". That is, (b -> c) -> (a -> b) -> (a -> c).

Pipe some data through a morphism.

compose/2, but with the arguments flipped (same direction as |>).

Link to this section Types

Link to this section Functions

@spec t() <~> any() :: t()

Composition operator "the pipe way". Alias for pipe_compose/2.

examples

Examples

iex> times_ten_plus_one =
...>       fn y -> y * 10 end
...>   <~> fn x -> x + 1  end
...>
...> times_ten_plus_one.(5)
51
Link to this function

apply(morphism, arguments)

View Source
@spec apply(t(), [any()]) :: t() | any()

Express how to apply arguments to the very end of a semigroupoid, or "run the morphism". This should not be used to inject values part way though a composition chain.

It is provided here to remain idiomatic with Elixir, and to make prop testing possible.

examples

Examples

iex> Witchcraft.Semigroupoid.apply(&inspect/1, [42])
"42"
Link to this function

compose(morphism_a, morphism_b)

View Source
@spec compose(t(), t()) :: t()

Take two morphisms and return their composition "the math way". That is, (b -> c) -> (a -> b) -> (a -> c).

examples

Examples

iex> times_ten_plus_one = compose(fn x -> x + 1 end, fn y -> y * 10 end)
...> times_ten_plus_one.(5)
51
@spec pipe(any(), t()) :: any()

Pipe some data through a morphism.

Similar to apply/2, but with a single argument, not needing to wrap the argument in a list.

examples

Examples

iex> pipe(42, &(&1 + 1))
43
@spec pipe_compose(t(), t()) :: t()

compose/2, but with the arguments flipped (same direction as |>).

examples

Examples

iex> times_ten_plus_one = pipe_compose(fn y -> y * 10 end, fn x -> x + 1 end)
...> times_ten_plus_one.(5)
51