# Witchcraft.Semigroupoid (Witchcraft v1.0.4) View Source

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

## 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

## Specs

t() :: any()

# Link to this section Functions

## Specs

Composition operator "the math way". Alias for `compose/2`

.

## Examples

```
iex> times_ten_plus_one =
...> fn x -> x + 1 end
...> <|> fn y -> y * 10 end
...>
...> times_ten_plus_one.(5)
51
```

## Specs

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

.

## Examples

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

## Specs

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

```
iex> Witchcraft.Semigroupoid.apply(&inspect/1, [42])
"42"
```

## Specs

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

.

## Examples

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

## Specs

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

```
iex> pipe(42, &(&1 + 1))
43
```

## Specs

`compose/2`

, but with the arguments flipped (same direction as `|>`

).

## Examples

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