concrete-optics.algebra.structures

Constructors and examples of semigroups, monoids, apply and applicatives.

additive-monoid

The semigroup on numbers whose opearion is addition. Since addition also has a unit, namely 0, this actually defines a monoid.

collect-errors-applicative

A failure where all failures are collected in a vector.

const-applicative

(const-applicative semigroup)

Promotes a semigroup into an apply. If the semigroup is a a monoid then the result is an applicative.

fail-fast-applicative

A failure applicative where only the first failure is kept.

fail-with

(fail-with x)

Wraps a value as a failure so that failure? can detect it.

failure?

(failure? x)

Checks if the input represents a failure, that it, if it is a map of the form {:failure <report>}.

first-semigroup

The semigroup whose operation picks the first argumet and ignores the second. There is no unit for this operation.

identity-applicative

This is the trivial applicative where there is no actual lifting.

map-failure

(map-failure to-new-failure f)

Changes the failure type for a validation function.

mk-apply

(mk-apply fmap binary-lift)(mk-apply fmap binary-lift pure)

Wraps a mapping operation and a binary operation lifter as {:fmap fmap :binary-lift binary-lift}. We assume that the wrapped functions satisfy the ‘semimonoidal functor’ laws. If there is also a pure operation which injects a regular value into the context then we assume that the wrapped values form an ‘applicative functor’.

mk-semigroup

(mk-semigroup binary-op)(mk-semigroup binary-op unit)

Wraps a binary associative operator as {:binary-op binary-op}. If in addition there is a unit then the result is the map {:binary-op binary-op :unit unit}. If there is a unit, the semigroup is indeed a monoid. A unit should not be encoded by a nil.

validation-applicative

(validation-applicative semigroup)

Constructs an applicative where failures are accumulated using the semigroup.

vector-monoid

The semigroup on vectors whose operation is concatenation. Since concatenation has a unit, namely [], this is actually a monoid.