# The domain interface

Existing types may add the interpretation of being a domain by implementing the domain interface. They gain the ability to interact with other domains.

## The in function

A domain is a set of elements that is possibly continuous. Continuous sets are defined mathematically, not by an exhaustive list of their elements. In practice membership of the set is defined by the implementation of in. The function call in(x, domain) evaluates to true if the domain contains an element y such that y == x.

Note

Incompatible element types. In principle, the function in(x, domain) should not throw an exception even if the types seem mathematically nonsensical. In that case, the correct return value is false. This mimicks the behaviour of in for finite sets in Julia:

julia> in(rand(3,3), 1:3)
false

Indeed, a 3x3 matrix is not equal to any of the numbers 1, 2 or 3.

## The domaineltype function

The defining mathematical condition of a continuous set might be satisfied by variables of different types. Still, the interface defines the domaineltype of a domain. It is a valid type for elements of the set.

Functions that generate elements of the domain should generate elements of that type. As a consequence, for finite sets such as an AbstractArray or AbstractSet, the domaineltype agrees with the eltype of that set. For intervals on the real line, the domaineltype might be Float64. When there is no clear candidate the domaineltype might simply be Any.

## Minimal formal interface

The domain interface is formally summarised in the following table:

Required methodsBrief description
in(x, d)Returns true when x is an element of the domain, false otherwise
DomainStyle(d)Returns IsDomain() if d implements this interface
Optional methodsDefault definitionBrief description
domaineltype(d)eltype(d)Returns a valid type for elements of the domain

Several extensions of this minimal interface are defined in the DomainSets package.

## The Domain supertype and DomainStyle trait

Domains in this package inherit from the abstract type Domain{T}. It is the supertype of continuous sets with domaineltype equal to T.

The package also defines the trait DomainStyle. Any type can declare to implement the domain interface by defining

DomainSets.DomainStyle(d::MyDomain) = IsDomain()

Objects of type Number, AbstractArray and AbstractSet are declared to be domains in this package.