(aka "Algebraic JavaScript Specification")

This project specifies interoperability of common algebraic structures:

An algebra is a set of values, a set of operators that it is closed under and some laws it must obey.
Each Fantasy Land algebra is a separate specification. An algebra may have dependencies on other algebras which must be implemented.
The type signature notation used in this document is described below:1
:: "is a member of".e :: t can be read as: "the expression e is a member of type t".true :: Boolean - "true is a member of type Boolean".42 :: Integer, Number - "42 is a member of the Integer and
Number types".Array is a type constructor which takes one type argument.Array String is the type of all arrays of strings. Each of the
following has type Array String: [], ['foo', 'bar', 'baz'].Array (Array String) is the type of all arrays of arrays of strings.
Each of the following has type Array (Array String): [], [ [], []
], [ [], ['foo'], ['bar', 'baz'] ].-> (arrow) Function type constructor.-> is an infix type constructor that takes two type arguments where
left argument is the input type and the right argument is the output type.->'s input type can be a grouping of types to create the type of a
function which accepts zero or more arguments. The syntax is:
(<input-types>) -> <output-type>, where <input-types> comprises zero
or more comma–space (,)-separated type representations and parens
may be omitted for unary functions.String -> Array String is a type satisfied by functions which take a
String and return an Array String.String -> Array String -> Array String is a type satisfied by functions
which take a String and return a function which takes an Array String
and returns an Array String.(String, Array String) -> Array String is a type satisfied by functions
which take a String and an Array String as arguments and return an
Array String.() -> Number is a type satisfied by functions
which do not take arguments and return a Number.~> (squiggly arrow) Method type constructor.a ~> a -> a is a type satisfied by methods on Objects of type a which
take a type a as an argument and return a value of type a.=> (fat arrow) Expresses constraints on type variables.a ~> a -> a (see squiggly arrow above), a can be of any type.
Semigroup a => a ~> a -> a adds a constraint such that the type a
must now satisfy the Semigroup typeclass. To satisfy a typeclass means
to lawfully implement all functions/methods specified by that typeclass.For example:
fantasy-land/traverse :: Applicative f, Traversable t => t a ~> (TypeRep f, a -> f b) -> f (t b)
'-------------------' '--------------------------' '-' '-------------------' '-----'
' ' ' ' '
' ' - type constraints ' ' - argument types ' - return type
' '
'- method name ' - method target type
Certain behaviours are defined from the perspective of a member of a type.
Other behaviours do not require a member. Thus certain algebras require a
type to provide a value-level representative (with certain properties). The
Identity type, for example, could provide Id as its type representative:
Id :: TypeRep Identity.
If a type provides a type representative, each member of the type must have
a constructor property which is a reference to the type representative.
a['fantasy-land/equals'](a) === true (reflexivity)a['fantasy-land/equals'](b) === b['fantasy-land/equals'](a) (symmetry)a['fantasy-land/equals'](b) and b['fantasy-land/equals'](c), then a['fantasy-land/equals'](c) (transitivity)fantasy-land/equals methodfantasy-land/equals :: Setoid a => a ~> a -> Boolean
A value which has a Setoid must provide a fantasy-land/equals method. The
fantasy-land/equals method takes one argument:
a['fantasy-land/equals'](b)
b must be a value of the same Setoid
b is not the same Setoid, behaviour of fantasy-land/equals is
unspecified (returning false is recommended).fantasy-land/equals must return a boolean (true or false).
A value that implements the Ord specification must also implement the Setoid specification.
a['fantasy-land/lte'](b) or b['fantasy-land/lte'](a) (totality)a['fantasy-land/lte'](b) and b['fantasy-land/lte'](a), then a['fantasy-land/equals'](b) (antisymmetry)a['fantasy-land/lte'](b) and b['fantasy-land/lte'](c), then a['fantasy-land/lte'](c) (transitivity)fantasy-land/lte methodfantasy-land/lte :: Ord a => a ~> a -> Boolean
A value which has an Ord must provide a fantasy-land/lte method. The
fantasy-land/lte method takes one argument:
a['fantasy-land/lte'](b)
b must be a value of the same Ord
b is not the same Ord, behaviour of fantasy-land/lte is
unspecified (returning false is recommended).fantasy-land/lte must return a boolean (true or false).
a['fantasy-land/compose'](b)['fantasy-land/compose'](c) === a['fantasy-land/compose'](b['fantasy-land/compose'](c)) (associativity)fantasy-land/compose methodfantasy-land/compose :: Semigroupoid c => c i j ~> c j k -> c i k
A value which has a Semigroupoid must provide a fantasy-land/compose method. The
fantasy-land/compose method takes one argument:
a['fantasy-land/compose'](b)
b must be a value of the same Semigroupoid
b is not the same semigroupoid, behaviour of fantasy-land/compose is
unspecified.fantasy-land/compose must return a value of the same Semigroupoid.
A value that implements the Category specification must also implement the Semigroupoid specification.
a['fantasy-land/compose'](C['fantasy-land/id']()) is equivalent to a (right identity)C['fantasy-land/id']()['fantasy-land/compose'](a) is equivalent to a (left identity)fantasy-land/id methodfantasy-land/id :: Category c => () -> c a a
A value which has a Category must provide a fantasy-land/id function on its
type representative:
C['fantasy-land/id']()
Given a value c, one can access its type representative via the
constructor property:
c.constructor['fantasy-land/id']()
fantasy-land/id must return a value of the same Categorya['fantasy-land/concat'](b)['fantasy-land/concat'](c) is equivalent to a['fantasy-land/concat'](b['fantasy-land/concat'](c)) (associativity)fantasy-land/concat methodfantasy-land/concat :: Semigroup a => a ~> a -> a
A value which has a Semigroup must provide a fantasy-land/concat method. The
fantasy-land/concat method takes one argument:
s['fantasy-land/concat'](b)
b must be a value of the same Semigroup
b is not the same semigroup, behaviour of fantasy-land/concat is
unspecified.fantasy-land/concat must return a value of the same Semigroup.
A value that implements the Monoid specification must also implement the Semigroup specification.
m['fantasy-land/concat'](M['fantasy-land/empty']()) is equivalent to m (right identity)M['fantasy-land/empty']()['fantasy-land/concat'](m) is equivalent to m (left identity)fantasy-land/empty methodfantasy-land/empty :: Monoid m => () -> m
A value which has a Monoid must provide a fantasy-land/empty function on its
type representative:
M['fantasy-land/empty']()
Given a value m, one can access its type representative via the
constructor property:
m.constructor['fantasy-land/empty']()
fantasy-land/empty must return a value of the same MonoidA value that implements the Group specification must also implement the Monoid specification.
g['fantasy-land/concat'](g['fantasy-land/invert']()) is equivalent to g.constructor['fantasy-land/empty']() (right inverse)g['fantasy-land/invert']()['fantasy-land/concat'](g) is equivalent to g.constructor['fantasy-land/empty']() (left inverse)fantasy-land/invert methodfantasy-land/invert :: Group g => g ~> () -> g
A value which has a Group must provide a fantasy-land/invert method. The
fantasy-land/invert method takes no arguments:
g['fantasy-land/invert']()
fantasy-land/invert must return a value of the same Group.v['fantasy-land/filter'](x => p(x) && q(x)) is equivalent to v['fantasy-land/filter'](p)['fantasy-land/filter'](q) (distributivity)v['fantasy-land/filter'](x => true) is equivalent to v (identity)v['fantasy-land/filter'](x => false) is equivalent to w['fantasy-land/filter'](x => false)
if v and w are values of the same Filterable (annihilation)fantasy-land/filter methodfantasy-land/filter :: Filterable f => f a ~> (a -> Boolean) -> f a
A value which has a Filterable must provide a fantasy-land/filter method. The fantasy-land/filter
method takes one argument:
v['fantasy-land/filter'](p)
p must be a function.
p is not a function, the behaviour of fantasy-land/filter is unspecified.p must return either true or false. If it returns any other value,
the behaviour of fantasy-land/filter is unspecified.fantasy-land/filter must return a value of the same Filterable.
u['fantasy-land/map'](a => a) is equivalent to u (identity)u['fantasy-land/map'](x => f(g(x))) is equivalent to u['fantasy-land/map'](g)['fantasy-land/map'](f) (composition)fantasy-land/map methodfantasy-land/map :: Functor f => f a ~> (a -> b) -> f b
A value which has a Functor must provide a fantasy-land/map method. The fantasy-land/map
method takes one argument:
u['fantasy-land/map'](f)
f must be a function,
f is not a function, the behaviour of fantasy-land/map is
unspecified.f can return any value.f's return value should be checked.fantasy-land/map must return a value of the same Functor
u['fantasy-land/contramap'](a => a) is equivalent to u (identity)u['fantasy-land/contramap'](x => f(g(x))) is equivalent to u['fantasy-land/contramap'](f)['fantasy-land/contramap'](g)
(composition)fantasy-land/contramap methodfantasy-land/contramap :: Contravariant f => f a ~> (b -> a) -> f b
A value which has a Contravariant must provide a fantasy-land/contramap method. The
fantasy-land/contramap method
—
$ claude mcp add fantasy-land \
-- python -m otcore.mcp_server <graph>