cas_compute/numerical/
func.rs1use std::collections::{HashMap, HashSet};
2use super::{builtin::Builtin, value::Value};
3
4#[cfg(feature = "serde")]
5use serde::{Deserialize, Deserializer, Serialize, Serializer};
6
7#[cfg(feature = "serde")]
8fn serialize_builtin<S>(builtin: &dyn Builtin, serializer: S) -> Result<S::Ok, S::Error>
9where
10 S: Serializer,
11{
12 serializer.serialize_str(builtin.name())
13}
14
15#[cfg(feature = "serde")]
16fn deserialize_builtin<'de, 'a, D>(deserializer: D) -> Result<&'a dyn Builtin, D::Error>
17where
18 D: Deserializer<'de>,
19{
20 let name = String::deserialize(deserializer)?;
21 let functions = crate::funcs::all();
22 functions.get(name.as_str())
23 .map(|f| &**f)
24 .ok_or_else(|| serde::de::Error::custom("unknown function"))
25}
26
27#[derive(Debug, Clone)]
32#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
33pub enum Function {
34 User(User),
38
39 #[cfg_attr(feature = "serde", serde(
41 serialize_with = "serialize_builtin",
42 deserialize_with = "deserialize_builtin"
43 ))]
44 Builtin(&'static dyn Builtin),
45}
46
47#[derive(Debug, Clone, PartialEq)]
49#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
50pub struct User {
51 pub index: usize,
55
56 pub captures: HashSet<usize>,
60
61 pub environment: HashMap<usize, Value>,
66}
67
68impl User {
69 pub fn new(index: usize, captures: HashSet<usize>) -> Self {
71 Self { index, captures, environment: HashMap::new() }
72 }
73}
74
75impl PartialEq for Function {
77 fn eq(&self, other: &Self) -> bool {
78 match (self, other) {
79 (Self::User(a), Self::User(b)) => a == b,
80 (Self::Builtin(a), Self::Builtin(b)) => std::ptr::eq(*a, *b),
81 _ => false,
82 }
83 }
84}