1use core::marker::PhantomData;
2use core::ops::{Deref, DerefMut};
3use emlite::FromVal;
4
5#[derive(Clone, Debug, PartialEq, PartialOrd)]
7#[repr(transparent)]
8pub struct Record<K, V> {
9 inner: emlite::Val,
11 phantom1: PhantomData<K>,
13 phantom2: PhantomData<V>,
15}
16
17impl<K, V> emlite::FromVal for Record<K, V> {
18 fn from_val(v: &emlite::Val) -> Self {
19 Self {
20 inner: v.clone(),
21 phantom1: PhantomData,
22 phantom2: PhantomData,
23 }
24 }
25 fn take_ownership(v: emlite::env::Handle) -> Self {
26 Self::from_val(&emlite::Val::take_ownership(v))
27 }
28 fn as_handle(&self) -> emlite::env::Handle {
29 self.inner.as_handle()
30 }
31}
32
33impl<K, V> From<Record<K, V>> for emlite::Val {
34 fn from(x: Record<K, V>) -> emlite::Val {
35 let handle = x.inner.as_handle();
36 core::mem::forget(x);
37 emlite::Val::take_ownership(handle)
38 }
39}
40
41impl<K, V> Deref for Record<K, V> {
42 type Target = emlite::Val;
43
44 fn deref(&self) -> &Self::Target {
45 &self.inner
46 }
47}
48
49impl<K, V> DerefMut for Record<K, V> {
50 fn deref_mut(&mut self) -> &mut Self::Target {
51 &mut self.inner
52 }
53}
54
55impl<K, V> AsRef<emlite::Val> for Record<K, V> {
56 fn as_ref(&self) -> &emlite::Val {
57 &self.inner
58 }
59}
60
61impl<K, V> AsMut<emlite::Val> for Record<K, V> {
62 fn as_mut(&mut self) -> &mut emlite::Val {
63 &mut self.inner
64 }
65}
66
67impl<K, V> Record<K, V> {
68 pub fn set(&self, item: K, val: V)
69 where
70 emlite::Val: From<K>,
71 emlite::Val: From<V>,
72 {
73 self.inner.set(item, val);
74 }
75
76 pub fn get(&self, item: K) -> V
77 where
78 emlite::Val: From<K>,
79 emlite::Val: From<V>,
80 V: FromVal,
81 {
82 self.inner.get(item).as_::<V>()
83 }
84
85 pub fn has(&self, item: K) -> bool
87 where
88 emlite::Val: From<K>,
89 {
90 self.inner.has(item)
91 }
92}