use core::marker::PhantomData;
use lean_rs::LeanExpr;
#[derive(Clone, Copy)]
pub struct LeanMetaService<Req, Resp> {
name: &'static str,
required_imports: &'static [&'static str],
_marker: PhantomData<fn(Req) -> Resp>,
}
impl<Req, Resp> LeanMetaService<Req, Resp> {
pub(crate) const fn new(name: &'static str, required_imports: &'static [&'static str]) -> Self {
Self {
name,
required_imports,
_marker: PhantomData,
}
}
#[must_use]
pub fn name(&self) -> &'static str {
self.name
}
#[must_use]
pub fn required_imports(&self) -> &'static [&'static str] {
self.required_imports
}
}
impl<Req, Resp> core::fmt::Debug for LeanMetaService<Req, Resp> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("LeanMetaService")
.field("name", &self.name)
.field("required_imports", &self.required_imports)
.finish()
}
}
const REQUIRED_IMPORTS: &[&str] = &["LeanRsHostShims.Meta"];
#[must_use]
pub fn infer_type<'lean>() -> LeanMetaService<LeanExpr<'lean>, LeanExpr<'lean>> {
LeanMetaService::new("lean_rs_host_meta_infer_type", REQUIRED_IMPORTS)
}
#[must_use]
pub fn whnf<'lean>() -> LeanMetaService<LeanExpr<'lean>, LeanExpr<'lean>> {
LeanMetaService::new("lean_rs_host_meta_whnf", REQUIRED_IMPORTS)
}
#[must_use]
pub fn heartbeat_burn<'lean>() -> LeanMetaService<LeanExpr<'lean>, LeanExpr<'lean>> {
LeanMetaService::new("lean_rs_host_meta_heartbeat_burn", REQUIRED_IMPORTS)
}