To install, run the following in a Julia session:
]add SubTypesTo create a custom subtype define the following data
SubType{T, P, Ctx}
^ ^ ^
| | |
| | L ______ Type Context
| L _________ Predicate Data
L ____________ Underlying Type
and a predicate processing function
check_predicate(P, Val(Ctx), x::T)which checks if x::T should be of type SubType{T, P, Ctx}. The context Ctx is the way to mark the subtypes for overloading.
The custom subtypes Constrained and ConstrainedSymbol are predefined in the SubType module. They emulate set inclusion subtyping, i.e.
x::Constrained{T, S} <=> x.value::T in SThe ConstrainedSymbol type emulates set inclusion for Symbol types. The Constrained type is defined as follows:
const Constrained{T,S} = SubType{T,S,:Constrained}Inspiration for this type comes from this post by Mohamed Tarek @mohamed82008.
This module also comes with these helper functions defined for terms and types:
| Helper Function | Component | Description |
|---|---|---|
eltype |
SubType{T} => T |
The underlying type where the subtype terms are drawn from. |
predicate |
SubType{T,P} => P |
The predicate data which determines the subtype terms. |
context |
SubType{T,P,Ctx} => Ctx |
The implementation label for the check_predicate function. |
support |
Constrained{T,S} => S |
The underlying set where the constrained variables are constrained to. |