#[macro_export]
macro_rules! register_manual {
(
ident: $ident:ident,
category: $cat:ty,
entity: $entity:ty,
name: $name:expr,
module: $module:expr,
source: $source:expr,
) => {
#[cfg(not(target_arch = "wasm32"))]
$crate::paste::paste! {
#[$crate::linkme::distributed_slice($crate::ontology::VOCABULARIES)]
#[linkme(crate = $crate::linkme)]
static [<_MANUAL_REGISTER_ $ident>]: fn() -> $crate::ontology::Vocabulary = || {
$crate::ontology::Vocabulary::from_ontology::<$cat, $entity>(
$name,
$module,
$source,
)
};
}
};
}
#[macro_export]
macro_rules! functor {
(
name: $name:ident,
source: $source:ty,
target: $target:ty,
citation: $citation:literal,
map_object: $map_obj:expr,
map_morphism: $map_morph:expr $(,)?
) => {
pub struct $name;
impl $crate::category::Functor for $name {
type Source = $source;
type Target = $target;
fn map_object(
obj: &<$source as $crate::category::Category>::Object,
) -> <$target as $crate::category::Category>::Object {
let f: fn(
&<$source as $crate::category::Category>::Object,
) -> <$target as $crate::category::Category>::Object = $map_obj;
f(obj)
}
fn map_morphism(
m: &<$source as $crate::category::Category>::Morphism,
) -> <$target as $crate::category::Category>::Morphism {
let f: fn(
&<$source as $crate::category::Category>::Morphism,
) -> <$target as $crate::category::Category>::Morphism = $map_morph;
f(m)
}
fn meta() -> $crate::ontology::meta::Provenance {
$crate::ontology::meta::Provenance {
name: $crate::ontology::meta::OntologyName::new_static(stringify!($name)),
description: $crate::ontology::meta::Label::new_static(stringify!($name)),
citation: $crate::ontology::meta::Citation::parse_static($citation),
module_path: $crate::ontology::meta::ModulePath::new_static(module_path!()),
}
}
}
#[cfg(not(target_arch = "wasm32"))]
$crate::paste::paste! {
#[$crate::linkme::distributed_slice($crate::ontology::FUNCTORS)]
#[linkme(crate = $crate::linkme)]
static [<_REGISTER_FUNCTOR_ $name:snake:upper>]: fn() -> $crate::ontology::meta::Provenance =
<$name as $crate::category::Functor>::meta;
}
};
}
#[macro_export]
macro_rules! adjunction {
(
name: $name:ident,
left: $left:ty,
right: $right:ty,
citation: $citation:literal,
unit: $unit:expr,
counit: $counit:expr $(,)?
) => {
pub struct $name;
impl $crate::category::Adjunction for $name {
type Left = $left;
type Right = $right;
fn unit(
obj: &<<$left as $crate::category::Functor>::Source as $crate::category::Category>::Object,
) -> <<$left as $crate::category::Functor>::Source as $crate::category::Category>::Morphism {
let f: fn(
&<<$left as $crate::category::Functor>::Source as $crate::category::Category>::Object,
) -> <<$left as $crate::category::Functor>::Source as $crate::category::Category>::Morphism = $unit;
f(obj)
}
fn counit(
obj: &<<$left as $crate::category::Functor>::Target as $crate::category::Category>::Object,
) -> <<$left as $crate::category::Functor>::Target as $crate::category::Category>::Morphism {
let f: fn(
&<<$left as $crate::category::Functor>::Target as $crate::category::Category>::Object,
) -> <<$left as $crate::category::Functor>::Target as $crate::category::Category>::Morphism = $counit;
f(obj)
}
fn meta() -> $crate::ontology::meta::Provenance {
$crate::ontology::meta::Provenance {
name: $crate::ontology::meta::OntologyName::new_static(stringify!($name)),
description: $crate::ontology::meta::Label::new_static(stringify!($name)),
citation: $crate::ontology::meta::Citation::parse_static($citation),
module_path: $crate::ontology::meta::ModulePath::new_static(module_path!()),
}
}
}
#[cfg(not(target_arch = "wasm32"))]
$crate::paste::paste! {
#[$crate::linkme::distributed_slice($crate::ontology::ADJUNCTIONS)]
#[linkme(crate = $crate::linkme)]
static [<_REGISTER_ADJUNCTION_ $name:snake:upper>]: fn() -> $crate::ontology::meta::Provenance =
<$name as $crate::category::Adjunction>::meta;
}
};
}
#[macro_export]
macro_rules! natural_transformation {
(
name: $name:ident,
from: $from:ty,
to: $to:ty,
citation: $citation:literal,
component: $component:expr $(,)?
) => {
pub struct $name;
impl $crate::category::NaturalTransformation for $name {
type SourceFunctor = $from;
type TargetFunctor = $to;
fn component(
obj: &<<$from as $crate::category::Functor>::Source as $crate::category::Category>::Object,
) -> <<$from as $crate::category::Functor>::Target as $crate::category::Category>::Morphism {
let f: fn(
&<<$from as $crate::category::Functor>::Source as $crate::category::Category>::Object,
) -> <<$from as $crate::category::Functor>::Target as $crate::category::Category>::Morphism = $component;
f(obj)
}
fn meta() -> $crate::ontology::meta::Provenance {
$crate::ontology::meta::Provenance {
name: $crate::ontology::meta::OntologyName::new_static(stringify!($name)),
description: $crate::ontology::meta::Label::new_static(stringify!($name)),
citation: $crate::ontology::meta::Citation::parse_static($citation),
module_path: $crate::ontology::meta::ModulePath::new_static(module_path!()),
}
}
}
#[cfg(not(target_arch = "wasm32"))]
$crate::paste::paste! {
#[$crate::linkme::distributed_slice($crate::ontology::NATURAL_TRANSFORMATIONS)]
#[linkme(crate = $crate::linkme)]
static [<_REGISTER_NAT_TRANS_ $name:snake:upper>]: fn() -> $crate::ontology::meta::Provenance =
<$name as $crate::category::NaturalTransformation>::meta;
}
};
}
#[macro_export]
macro_rules! register_axiom {
($name:ident, $citation:literal) => {
#[cfg(not(target_arch = "wasm32"))]
$crate::paste::paste! {
#[$crate::linkme::distributed_slice($crate::ontology::AXIOMS)]
#[linkme(crate = $crate::linkme)]
static [<_REGISTER_AXIOM_ $name:snake:upper>]: fn() -> $crate::ontology::meta::Provenance =
|| $crate::ontology::meta::Provenance {
name: $crate::ontology::meta::OntologyName::new_static(stringify!($name)),
description: $crate::ontology::meta::Label::new_static(stringify!($name)),
citation: $crate::ontology::meta::Citation::parse_static($citation),
module_path: $crate::ontology::meta::ModulePath::new_static(module_path!()),
};
}
};
($name:ident, instance: $instance:expr) => {
#[cfg(not(target_arch = "wasm32"))]
$crate::paste::paste! {
#[$crate::linkme::distributed_slice($crate::ontology::AXIOMS)]
#[linkme(crate = $crate::linkme)]
static [<_REGISTER_AXIOM_ $name:snake:upper>]: fn() -> $crate::ontology::meta::Provenance =
|| <$name as $crate::logic::axiom::Axiom>::meta(&$instance);
}
};
}
#[macro_export]
macro_rules! register_functor {
($name:ident) => {
#[cfg(not(target_arch = "wasm32"))]
$crate::paste::paste! {
#[$crate::linkme::distributed_slice($crate::ontology::FUNCTORS)]
#[linkme(crate = $crate::linkme)]
static [<_REGISTER_FUNCTOR_ $name:snake:upper>]: fn() -> $crate::ontology::meta::Provenance =
<$name as $crate::category::Functor>::meta;
}
};
($name:ident, $citation:literal) => {
#[cfg(not(target_arch = "wasm32"))]
$crate::paste::paste! {
#[$crate::linkme::distributed_slice($crate::ontology::FUNCTORS)]
#[linkme(crate = $crate::linkme)]
static [<_REGISTER_FUNCTOR_ $name:snake:upper>]: fn() -> $crate::ontology::meta::Provenance =
|| $crate::ontology::meta::Provenance {
name: $crate::ontology::meta::OntologyName::new_static(stringify!($name)),
description: $crate::ontology::meta::Label::new_static(stringify!($name)),
citation: $crate::ontology::meta::Citation::parse_static($citation),
module_path: $crate::ontology::meta::ModulePath::new_static(module_path!()),
};
}
};
}
#[macro_export]
macro_rules! register_adjunction {
($name:ident) => {
#[cfg(not(target_arch = "wasm32"))]
$crate::paste::paste! {
#[$crate::linkme::distributed_slice($crate::ontology::ADJUNCTIONS)]
#[linkme(crate = $crate::linkme)]
static [<_REGISTER_ADJUNCTION_ $name:snake:upper>]: fn() -> $crate::ontology::meta::Provenance =
<$name as $crate::category::Adjunction>::meta;
}
};
($name:ident, $citation:literal) => {
#[cfg(not(target_arch = "wasm32"))]
$crate::paste::paste! {
#[$crate::linkme::distributed_slice($crate::ontology::ADJUNCTIONS)]
#[linkme(crate = $crate::linkme)]
static [<_REGISTER_ADJUNCTION_ $name:snake:upper>]: fn() -> $crate::ontology::meta::Provenance =
|| $crate::ontology::meta::Provenance {
name: $crate::ontology::meta::OntologyName::new_static(stringify!($name)),
description: $crate::ontology::meta::Label::new_static(stringify!($name)),
citation: $crate::ontology::meta::Citation::parse_static($citation),
module_path: $crate::ontology::meta::ModulePath::new_static(module_path!()),
};
}
};
}
#[macro_export]
macro_rules! register_natural_transformation {
($name:ident) => {
#[cfg(not(target_arch = "wasm32"))]
$crate::paste::paste! {
#[$crate::linkme::distributed_slice($crate::ontology::NATURAL_TRANSFORMATIONS)]
#[linkme(crate = $crate::linkme)]
static [<_REGISTER_NAT_TRANS_ $name:snake:upper>]: fn() -> $crate::ontology::meta::Provenance =
<$name as $crate::category::NaturalTransformation>::meta;
}
};
($name:ident, $citation:literal) => {
#[cfg(not(target_arch = "wasm32"))]
$crate::paste::paste! {
#[$crate::linkme::distributed_slice($crate::ontology::NATURAL_TRANSFORMATIONS)]
#[linkme(crate = $crate::linkme)]
static [<_REGISTER_NAT_TRANS_ $name:snake:upper>]: fn() -> $crate::ontology::meta::Provenance =
|| $crate::ontology::meta::Provenance {
name: $crate::ontology::meta::OntologyName::new_static(stringify!($name)),
description: $crate::ontology::meta::Label::new_static(stringify!($name)),
citation: $crate::ontology::meta::Citation::parse_static($citation),
module_path: $crate::ontology::meta::ModulePath::new_static(module_path!()),
};
}
};
}
#[macro_export]
macro_rules! axiom_meta {
($name:literal, $description:literal, $citation:literal) => {
fn name(&self) -> $crate::ontology::meta::OntologyName {
$crate::ontology::meta::OntologyName::new_static($name)
}
fn description(&self) -> $crate::ontology::meta::Label {
$crate::ontology::meta::Label::new_static($description)
}
fn citation(&self) -> $crate::ontology::meta::Citation {
$crate::ontology::meta::Citation::parse_static($citation)
}
};
($name:literal, $citation:literal) => {
fn name(&self) -> $crate::ontology::meta::OntologyName {
$crate::ontology::meta::OntologyName::new_static($name)
}
fn description(&self) -> $crate::ontology::meta::Label {
$crate::ontology::meta::Label::new_static($name)
}
fn citation(&self) -> $crate::ontology::meta::Citation {
$crate::ontology::meta::Citation::parse_static($citation)
}
};
}
#[macro_export]
macro_rules! relationship_meta {
($name:literal, $description:literal, $citation:literal) => {
fn meta() -> $crate::ontology::meta::Provenance {
$crate::ontology::meta::Provenance {
name: $crate::ontology::meta::OntologyName::new_static($name),
description: $crate::ontology::meta::Label::new_static($description),
citation: $crate::ontology::meta::Citation::parse_static($citation),
module_path: $crate::ontology::meta::ModulePath::new_static(module_path!()),
}
}
};
($name:literal, $citation:literal) => {
fn meta() -> $crate::ontology::meta::Provenance {
$crate::ontology::meta::Provenance {
name: $crate::ontology::meta::OntologyName::new_static($name),
description: $crate::ontology::meta::Label::new_static($name),
citation: $crate::ontology::meta::Citation::parse_static($citation),
module_path: $crate::ontology::meta::ModulePath::new_static(module_path!()),
}
}
};
}