rune/modules/
ops.rs
1pub mod generator;
4
5use core::cmp::Ordering;
6
7use once_cell::sync::OnceCell;
8use rune::item;
9
10use crate as rune;
11use crate::alloc::hash_map::RandomState;
12use crate::runtime::range::RangeIter;
13use crate::runtime::range_from::RangeFromIter;
14use crate::runtime::range_inclusive::RangeInclusiveIter;
15use crate::runtime::{
16 ControlFlow, EnvProtocolCaller, Function, Hasher, Range, RangeFrom, RangeFull, RangeInclusive,
17 RangeTo, RangeToInclusive, Value, VmResult,
18};
19use crate::{ContextError, Module};
20
21static STATE: OnceCell<RandomState> = OnceCell::new();
22
23#[rune::module(::std::ops)]
25pub fn module() -> Result<Module, ContextError> {
26 let mut m = Module::from_meta(self::module_meta)?;
27
28 macro_rules! iter {
29 ($ty:ident) => {
30 m.ty::<$ty<i64>>()?;
31 m.function_meta($ty::<i64>::next__meta)?;
32 m.function_meta($ty::<i64>::size_hint__meta)?;
33 m.implement_trait::<$ty<i64>>(rune::item!(::std::iter::Iterator))?;
34
35 m.ty::<$ty<u64>>()?;
36 m.function_meta($ty::<u64>::next__meta)?;
37 m.function_meta($ty::<u64>::size_hint__meta)?;
38 m.implement_trait::<$ty<u64>>(rune::item!(::std::iter::Iterator))?;
39
40 m.ty::<$ty<char>>()?;
41 m.function_meta($ty::<char>::next__meta)?;
42 m.function_meta($ty::<char>::size_hint__meta)?;
43 m.implement_trait::<$ty<char>>(rune::item!(::std::iter::Iterator))?;
44 };
45 }
46
47 macro_rules! double_ended {
48 ($ty:ident) => {
49 iter!($ty);
50
51 m.function_meta($ty::<i64>::next_back__meta)?;
52 m.implement_trait::<$ty<i64>>(rune::item!(::std::iter::DoubleEndedIterator))?;
53
54 m.function_meta($ty::<i64>::len__meta)?;
55 m.implement_trait::<$ty<i64>>(rune::item!(::std::iter::ExactSizeIterator))?;
56
57 m.function_meta($ty::<u64>::next_back__meta)?;
58 m.implement_trait::<$ty<u64>>(rune::item!(::std::iter::DoubleEndedIterator))?;
59
60 m.function_meta($ty::<u64>::len__meta)?;
61 m.implement_trait::<$ty<u64>>(rune::item!(::std::iter::ExactSizeIterator))?;
62
63 m.function_meta($ty::<char>::next_back__meta)?;
64 m.implement_trait::<$ty<char>>(rune::item!(::std::iter::DoubleEndedIterator))?;
65 };
66 }
67
68 {
69 m.ty::<RangeFrom>()?;
70 m.function_meta(RangeFrom::iter__meta)?;
71 m.function_meta(RangeFrom::into_iter__meta)?;
72 m.function_meta(RangeFrom::contains__meta)?;
73
74 m.function_meta(RangeFrom::partial_eq__meta)?;
75 m.implement_trait::<RangeFrom>(item!(::std::cmp::PartialEq))?;
76
77 m.function_meta(RangeFrom::eq__meta)?;
78 m.implement_trait::<RangeFrom>(item!(::std::cmp::Eq))?;
79
80 m.function_meta(RangeFrom::partial_cmp__meta)?;
81 m.implement_trait::<RangeFrom>(item!(::std::cmp::PartialOrd))?;
82
83 m.function_meta(RangeFrom::cmp__meta)?;
84 m.implement_trait::<RangeFrom>(item!(::std::cmp::Ord))?;
85
86 iter!(RangeFromIter);
87 }
88
89 {
90 m.ty::<RangeFull>()?;
91 m.function_meta(RangeFull::contains__meta)?;
92
93 m.function_meta(RangeFull::partial_eq__meta)?;
94 m.implement_trait::<RangeFull>(item!(::std::cmp::PartialEq))?;
95
96 m.function_meta(RangeFull::eq__meta)?;
97 m.implement_trait::<RangeFull>(item!(::std::cmp::Eq))?;
98
99 m.function_meta(RangeFull::partial_cmp__meta)?;
100 m.implement_trait::<RangeFull>(item!(::std::cmp::PartialOrd))?;
101
102 m.function_meta(RangeFull::cmp__meta)?;
103 m.implement_trait::<RangeFull>(item!(::std::cmp::Ord))?;
104 }
105
106 {
107 m.ty::<RangeInclusive>()?;
108 m.function_meta(RangeInclusive::iter__meta)?;
109 m.function_meta(RangeInclusive::into_iter__meta)?;
110 m.function_meta(RangeInclusive::contains__meta)?;
111
112 m.function_meta(RangeInclusive::partial_eq__meta)?;
113 m.implement_trait::<RangeInclusive>(item!(::std::cmp::PartialEq))?;
114
115 m.function_meta(RangeInclusive::eq__meta)?;
116 m.implement_trait::<RangeInclusive>(item!(::std::cmp::Eq))?;
117
118 m.function_meta(RangeInclusive::partial_cmp__meta)?;
119 m.implement_trait::<RangeInclusive>(item!(::std::cmp::PartialOrd))?;
120
121 m.function_meta(RangeInclusive::cmp__meta)?;
122 m.implement_trait::<RangeInclusive>(item!(::std::cmp::Ord))?;
123
124 double_ended!(RangeInclusiveIter);
125 }
126
127 {
128 m.ty::<RangeToInclusive>()?;
129 m.function_meta(RangeToInclusive::contains__meta)?;
130
131 m.function_meta(RangeToInclusive::partial_eq__meta)?;
132 m.implement_trait::<RangeToInclusive>(item!(::std::cmp::PartialEq))?;
133
134 m.function_meta(RangeToInclusive::eq__meta)?;
135 m.implement_trait::<RangeToInclusive>(item!(::std::cmp::Eq))?;
136
137 m.function_meta(RangeToInclusive::partial_cmp__meta)?;
138 m.implement_trait::<RangeToInclusive>(item!(::std::cmp::PartialOrd))?;
139
140 m.function_meta(RangeToInclusive::cmp__meta)?;
141 m.implement_trait::<RangeToInclusive>(item!(::std::cmp::Ord))?;
142 }
143
144 {
145 m.ty::<RangeTo>()?;
146 m.function_meta(RangeTo::contains__meta)?;
147
148 m.function_meta(RangeTo::partial_eq__meta)?;
149 m.implement_trait::<RangeTo>(item!(::std::cmp::PartialEq))?;
150
151 m.function_meta(RangeTo::eq__meta)?;
152 m.implement_trait::<RangeTo>(item!(::std::cmp::Eq))?;
153
154 m.function_meta(RangeTo::partial_cmp__meta)?;
155 m.implement_trait::<RangeTo>(item!(::std::cmp::PartialOrd))?;
156
157 m.function_meta(RangeTo::cmp__meta)?;
158 m.implement_trait::<RangeTo>(item!(::std::cmp::Ord))?;
159 }
160
161 {
162 m.ty::<Range>()?;
163 m.function_meta(Range::iter__meta)?;
164 m.function_meta(Range::into_iter__meta)?;
165 m.function_meta(Range::contains__meta)?;
166
167 m.function_meta(Range::partial_eq__meta)?;
168 m.implement_trait::<Range>(item!(::std::cmp::PartialEq))?;
169
170 m.function_meta(Range::eq__meta)?;
171 m.implement_trait::<Range>(item!(::std::cmp::Eq))?;
172
173 m.function_meta(Range::partial_cmp__meta)?;
174 m.implement_trait::<Range>(item!(::std::cmp::PartialOrd))?;
175
176 m.function_meta(Range::cmp__meta)?;
177 m.implement_trait::<Range>(item!(::std::cmp::Ord))?;
178
179 double_ended!(RangeIter);
180 }
181
182 {
183 m.ty::<ControlFlow>()?;
184
185 m.function_meta(ControlFlow::partial_eq__meta)?;
186 m.implement_trait::<ControlFlow>(item!(::std::cmp::PartialEq))?;
187
188 m.function_meta(ControlFlow::eq__meta)?;
189 m.implement_trait::<ControlFlow>(item!(::std::cmp::Eq))?;
190
191 m.function_meta(ControlFlow::debug_fmt__meta)?;
192
193 m.function_meta(ControlFlow::clone__meta)?;
194 m.implement_trait::<ControlFlow>(item!(::std::clone::Clone))?;
195 }
196
197 m.ty::<Function>()?;
198 m.function_meta(Function::clone__meta)?;
199 m.implement_trait::<Function>(item!(::std::clone::Clone))?;
200 m.function_meta(Function::debug_fmt__meta)?;
201
202 m.function_meta(partial_eq__meta)?;
203 m.function_meta(eq__meta)?;
204 m.function_meta(partial_cmp__meta)?;
205 m.function_meta(cmp__meta)?;
206 m.function_meta(hash__meta)?;
207
208 m.reexport(["Generator"], item!(::std::ops::generator::Generator))?;
209 m.reexport(
210 ["GeneratorState"],
211 item!(::std::ops::generator::GeneratorState),
212 )?;
213 Ok(m)
214}
215
216#[rune::function(keep)]
236fn partial_eq(lhs: Value, rhs: Value) -> VmResult<bool> {
237 Value::partial_eq(&lhs, &rhs)
238}
239
240#[rune::function(keep)]
259fn eq(lhs: Value, rhs: Value) -> VmResult<bool> {
260 Value::eq(&lhs, &rhs)
261}
262
263#[rune::function(keep)]
286fn partial_cmp(lhs: Value, rhs: Value) -> VmResult<Option<Ordering>> {
287 Value::partial_cmp(&lhs, &rhs)
288}
289
290#[rune::function(keep)]
314fn cmp(lhs: Value, rhs: Value) -> VmResult<Ordering> {
315 Value::cmp(&lhs, &rhs)
316}
317
318#[rune::function(keep)]
341fn hash(value: Value) -> VmResult<u64> {
342 let state = STATE.get_or_init(RandomState::new);
343 let mut hasher = Hasher::new_with(state);
344
345 vm_try!(Value::hash_with(
346 &value,
347 &mut hasher,
348 &mut EnvProtocolCaller
349 ));
350
351 VmResult::Ok(hasher.finish())
352}