use super::FontTables;
use crate::tables::{glyf::Glyf, gvar::Gvar, hvar::Hvar, loca::Loca};
use crate::TableProvider;
use alloc::sync::Arc;
use yoke::{Yoke, Yokeable};
pub(crate) struct TableCache<Y: for<'a> Yokeable<'a>>(Yoke<Y, Arc<FontTables>>);
impl<Y: for<'a> Yokeable<'a>> TableCache<Y> {
pub(crate) fn read<F>(tables: Arc<FontTables>, read: F) -> Self
where
F: for<'a> FnOnce(&'a FontTables) -> <Y as Yokeable<'a>>::Output,
{
Self(Yoke::attach_to_cart(tables, read))
}
#[inline]
pub(crate) fn get(&self) -> &<Y as Yokeable<'_>>::Output {
self.0.get()
}
}
#[derive(Clone, Default, Yokeable)]
pub(crate) struct GlyfLoca<'a>(pub(crate) Option<(Glyf<'a>, Loca<'a>)>);
impl<'a> GlyfLoca<'a> {
pub(crate) fn read(tables: &impl TableProvider<'a>) -> Self {
Self(tables.glyf().ok().zip(tables.loca(None).ok()))
}
}
#[derive(Clone, Default, Yokeable)]
pub(crate) struct HvarTable<'a>(pub(crate) Option<Hvar<'a>>);
impl<'a> HvarTable<'a> {
pub(crate) fn read(tables: &impl TableProvider<'a>) -> Self {
Self(tables.hvar().ok())
}
}
#[derive(Clone, Default, Yokeable)]
pub(crate) struct GvarTable<'a>(pub(crate) Option<Gvar<'a>>);
impl<'a> GvarTable<'a> {
pub(crate) fn read(tables: &impl TableProvider<'a>) -> Self {
Self(tables.gvar().ok())
}
}