1use crate::arena::DataArena;
2use crate::logic::ArrayOp;
3use crate::logic::{Logic, OperatorType};
4
5pub struct ArrayBuilder<'a> {
10 arena: &'a DataArena,
12}
13
14impl<'a> ArrayBuilder<'a> {
15 pub fn new(arena: &'a DataArena) -> Self {
17 Self { arena }
18 }
19
20 pub fn map_op(&self) -> MapBuilder<'a> {
22 MapBuilder::new(self.arena)
23 }
24
25 pub fn filter_op(&self) -> FilterBuilder<'a> {
27 FilterBuilder::new(self.arena)
28 }
29
30 pub fn reduce_op(&self) -> ReduceBuilder<'a> {
32 ReduceBuilder::new(self.arena)
33 }
34
35 pub fn merge_op(&self) -> ArrayOperationBuilder<'a> {
37 ArrayOperationBuilder::new(self.arena, ArrayOp::Merge)
38 }
39
40 pub fn length_op(&self, array: Logic<'a>) -> Logic<'a> {
42 Logic::operator(
43 OperatorType::Array(ArrayOp::Length),
44 vec![array],
45 self.arena,
46 )
47 }
48
49 pub fn slice_op(&self) -> SliceBuilder<'a> {
51 SliceBuilder::new(self.arena)
52 }
53
54 pub fn sort_op(&self) -> SortBuilder<'a> {
56 SortBuilder::new(self.arena)
57 }
58
59 pub fn in_op(&self, value: Logic<'a>, array: Logic<'a>) -> Logic<'a> {
61 Logic::operator(
62 OperatorType::Array(ArrayOp::In),
63 vec![value, array],
64 self.arena,
65 )
66 }
67
68 pub fn array_literal_op(&self, elements: Vec<Logic<'a>>) -> Logic<'a> {
70 Logic::operator(OperatorType::ArrayLiteral, elements, self.arena)
71 }
72}
73
74pub struct MapBuilder<'a> {
76 arena: &'a DataArena,
78 array: Option<Logic<'a>>,
80 mapper: Option<Logic<'a>>,
82}
83
84impl<'a> MapBuilder<'a> {
85 pub fn new(arena: &'a DataArena) -> Self {
87 Self {
88 arena,
89 array: None,
90 mapper: None,
91 }
92 }
93
94 pub fn array(mut self, array: Logic<'a>) -> Self {
96 self.array = Some(array);
97 self
98 }
99
100 pub fn array_literal(self, elements: Vec<Logic<'a>>) -> Self {
102 let array = Logic::operator(OperatorType::ArrayLiteral, elements, self.arena);
103 self.array(array)
104 }
105
106 pub fn array_var(self, path: &str) -> Self {
108 let var = Logic::variable(path, None, self.arena);
109 self.array(var)
110 }
111
112 pub fn mapper(mut self, mapper: Logic<'a>) -> Self {
114 self.mapper = Some(mapper);
115 self
116 }
117
118 pub fn mapper_var(self, path: &str) -> Self {
120 let var = Logic::variable(path, None, self.arena);
121 self.mapper(var)
122 }
123
124 pub fn build(self) -> Logic<'a> {
126 let array = self.array.unwrap_or_else(|| {
127 Logic::literal(crate::value::DataValue::array(self.arena, &[]), self.arena)
128 });
129
130 let mapper = self.mapper.unwrap_or_else(|| {
131 Logic::variable("", None, self.arena)
133 });
134
135 Logic::operator(
136 OperatorType::Array(ArrayOp::Map),
137 vec![array, mapper],
138 self.arena,
139 )
140 }
141}
142
143pub struct FilterBuilder<'a> {
145 arena: &'a DataArena,
147 array: Option<Logic<'a>>,
149 condition: Option<Logic<'a>>,
151}
152
153impl<'a> FilterBuilder<'a> {
154 pub fn new(arena: &'a DataArena) -> Self {
156 Self {
157 arena,
158 array: None,
159 condition: None,
160 }
161 }
162
163 pub fn array(mut self, array: Logic<'a>) -> Self {
165 self.array = Some(array);
166 self
167 }
168
169 pub fn array_literal(self, elements: Vec<Logic<'a>>) -> Self {
171 let array = Logic::operator(OperatorType::ArrayLiteral, elements, self.arena);
172 self.array(array)
173 }
174
175 pub fn array_var(self, path: &str) -> Self {
177 let var = Logic::variable(path, None, self.arena);
178 self.array(var)
179 }
180
181 pub fn condition(mut self, condition: Logic<'a>) -> Self {
183 self.condition = Some(condition);
184 self
185 }
186
187 pub fn condition_var(self, path: &str) -> Self {
189 let var = Logic::variable(path, None, self.arena);
190 self.condition(var)
191 }
192
193 pub fn build(self) -> Logic<'a> {
195 let array = self.array.unwrap_or_else(|| {
196 Logic::literal(crate::value::DataValue::array(self.arena, &[]), self.arena)
197 });
198
199 let condition = self.condition.unwrap_or_else(|| {
200 Logic::variable("", None, self.arena)
202 });
203
204 Logic::operator(
205 OperatorType::Array(ArrayOp::Filter),
206 vec![array, condition],
207 self.arena,
208 )
209 }
210}
211
212pub struct ReduceBuilder<'a> {
214 arena: &'a DataArena,
216 array: Option<Logic<'a>>,
218 reducer: Option<Logic<'a>>,
220 initial: Option<Logic<'a>>,
222}
223
224impl<'a> ReduceBuilder<'a> {
225 pub fn new(arena: &'a DataArena) -> Self {
227 Self {
228 arena,
229 array: None,
230 reducer: None,
231 initial: None,
232 }
233 }
234
235 pub fn array(mut self, array: Logic<'a>) -> Self {
237 self.array = Some(array);
238 self
239 }
240
241 pub fn array_literal(self, elements: Vec<Logic<'a>>) -> Self {
243 let array = Logic::operator(OperatorType::ArrayLiteral, elements, self.arena);
244 self.array(array)
245 }
246
247 pub fn array_var(self, path: &str) -> Self {
249 let var = Logic::variable(path, None, self.arena);
250 self.array(var)
251 }
252
253 pub fn reducer(mut self, reducer: Logic<'a>) -> Self {
255 self.reducer = Some(reducer);
256 self
257 }
258
259 pub fn reducer_var(self, path: &str) -> Self {
261 let var = Logic::variable(path, None, self.arena);
262 self.reducer(var)
263 }
264
265 pub fn initial(mut self, initial: Logic<'a>) -> Self {
267 self.initial = Some(initial);
268 self
269 }
270
271 pub fn initial_var(self, path: &str) -> Self {
273 let var = Logic::variable(path, None, self.arena);
274 self.initial(var)
275 }
276
277 pub fn initial_int(self, value: i64) -> Self {
279 let val = Logic::literal(crate::value::DataValue::integer(value), self.arena);
280 self.initial(val)
281 }
282
283 pub fn initial_float(self, value: f64) -> Self {
285 let val = Logic::literal(crate::value::DataValue::float(value), self.arena);
286 self.initial(val)
287 }
288
289 pub fn initial_string(self, value: &str) -> Self {
291 let val = Logic::literal(
292 crate::value::DataValue::string(self.arena, value),
293 self.arena,
294 );
295 self.initial(val)
296 }
297
298 pub fn initial_bool(self, value: bool) -> Self {
300 let val = Logic::literal(crate::value::DataValue::bool(value), self.arena);
301 self.initial(val)
302 }
303
304 pub fn build(self) -> Logic<'a> {
306 let array = self.array.unwrap_or_else(|| {
307 Logic::literal(crate::value::DataValue::array(self.arena, &[]), self.arena)
308 });
309
310 let reducer = self.reducer.unwrap_or_else(|| {
311 let var_a = Logic::variable("current", None, self.arena);
313 let var_b = Logic::variable("accumulator", None, self.arena);
314 Logic::operator(
315 OperatorType::Arithmetic(crate::logic::ArithmeticOp::Add),
316 vec![var_a, var_b],
317 self.arena,
318 )
319 });
320
321 let initial = self.initial.unwrap_or_else(|| {
322 Logic::literal(crate::value::DataValue::integer(0), self.arena)
324 });
325
326 Logic::operator(
327 OperatorType::Array(ArrayOp::Reduce),
328 vec![array, reducer, initial],
329 self.arena,
330 )
331 }
332}
333
334pub struct ArrayOperationBuilder<'a> {
336 arena: &'a DataArena,
338 operation: ArrayOp,
340 operands: Vec<Logic<'a>>,
342}
343
344impl<'a> ArrayOperationBuilder<'a> {
345 pub fn new(arena: &'a DataArena, operation: ArrayOp) -> Self {
347 Self {
348 arena,
349 operation,
350 operands: Vec::new(),
351 }
352 }
353
354 pub fn operand(mut self, operand: Logic<'a>) -> Self {
356 self.operands.push(operand);
357 self
358 }
359
360 pub fn var(mut self, path: &str) -> Self {
362 let var = Logic::variable(path, None, self.arena);
363 self.operands.push(var);
364 self
365 }
366
367 pub fn value<T: Into<crate::value::DataValue<'a>>>(mut self, value: T) -> Self {
369 let val = Logic::literal(value.into(), self.arena);
370 self.operands.push(val);
371 self
372 }
373
374 pub fn int(mut self, value: i64) -> Self {
376 let val = Logic::literal(crate::value::DataValue::integer(value), self.arena);
377 self.operands.push(val);
378 self
379 }
380
381 pub fn float(mut self, value: f64) -> Self {
383 let val = Logic::literal(crate::value::DataValue::float(value), self.arena);
384 self.operands.push(val);
385 self
386 }
387
388 pub fn string(mut self, value: &str) -> Self {
390 let val = Logic::literal(
391 crate::value::DataValue::string(self.arena, value),
392 self.arena,
393 );
394 self.operands.push(val);
395 self
396 }
397
398 pub fn bool(mut self, value: bool) -> Self {
400 let val = Logic::literal(crate::value::DataValue::bool(value), self.arena);
401 self.operands.push(val);
402 self
403 }
404
405 pub fn build(self) -> Logic<'a> {
407 if self.operands.is_empty() {
408 return Logic::literal(crate::value::DataValue::array(self.arena, &[]), self.arena);
409 }
410
411 Logic::operator(
412 OperatorType::Array(self.operation),
413 self.operands,
414 self.arena,
415 )
416 }
417}
418
419pub struct SliceBuilder<'a> {
421 arena: &'a DataArena,
423 collection: Option<Logic<'a>>,
425 start: Option<Logic<'a>>,
427 end: Option<Logic<'a>>,
429 step: Option<Logic<'a>>,
431}
432
433impl<'a> SliceBuilder<'a> {
434 pub fn new(arena: &'a DataArena) -> Self {
436 Self {
437 arena,
438 collection: None,
439 start: None,
440 end: None,
441 step: None,
442 }
443 }
444
445 pub fn collection(mut self, collection: Logic<'a>) -> Self {
447 self.collection = Some(collection);
448 self
449 }
450
451 pub fn collection_var(self, path: &str) -> Self {
453 let var = Logic::variable(path, None, self.arena);
454 self.collection(var)
455 }
456
457 pub fn start(mut self, start: Logic<'a>) -> Self {
459 self.start = Some(start);
460 self
461 }
462
463 pub fn start_int(self, value: i64) -> Self {
465 let val = Logic::literal(crate::value::DataValue::integer(value), self.arena);
466 self.start(val)
467 }
468
469 pub fn end(mut self, end: Logic<'a>) -> Self {
471 self.end = Some(end);
472 self
473 }
474
475 pub fn end_int(self, value: i64) -> Self {
477 let val = Logic::literal(crate::value::DataValue::integer(value), self.arena);
478 self.end(val)
479 }
480
481 pub fn step(mut self, step: Logic<'a>) -> Self {
483 self.step = Some(step);
484 self
485 }
486
487 pub fn step_int(self, value: i64) -> Self {
489 let val = Logic::literal(crate::value::DataValue::integer(value), self.arena);
490 self.step(val)
491 }
492
493 pub fn build(self) -> Logic<'a> {
495 let mut args = Vec::new();
496
497 args.push(self.collection.unwrap_or_else(|| {
499 Logic::literal(crate::value::DataValue::array(self.arena, &[]), self.arena)
500 }));
501
502 if let Some(start) = self.start {
504 args.push(start);
505 if let Some(end) = self.end {
506 args.push(end);
507 if let Some(step) = self.step {
508 args.push(step);
509 }
510 }
511 }
512
513 Logic::operator(OperatorType::Array(ArrayOp::Slice), args, self.arena)
514 }
515}
516
517pub struct SortBuilder<'a> {
519 arena: &'a DataArena,
521 array: Option<Logic<'a>>,
523 ascending: Option<Logic<'a>>,
525 extractor: Option<Logic<'a>>,
527}
528
529impl<'a> SortBuilder<'a> {
530 pub fn new(arena: &'a DataArena) -> Self {
532 Self {
533 arena,
534 array: None,
535 ascending: None,
536 extractor: None,
537 }
538 }
539
540 pub fn array(mut self, array: Logic<'a>) -> Self {
542 self.array = Some(array);
543 self
544 }
545
546 pub fn array_var(self, path: &str) -> Self {
548 let var = Logic::variable(path, None, self.arena);
549 self.array(var)
550 }
551
552 pub fn ascending(mut self, ascending: bool) -> Self {
554 let val = Logic::literal(crate::value::DataValue::bool(ascending), self.arena);
555 self.ascending = Some(val);
556 self
557 }
558
559 pub fn extractor(mut self, extractor: Logic<'a>) -> Self {
561 self.extractor = Some(extractor);
562 self
563 }
564
565 pub fn extractor_var(self, path: &str) -> Self {
567 let var = Logic::variable(path, None, self.arena);
568 self.extractor(var)
569 }
570
571 pub fn build(self) -> Logic<'a> {
573 let mut args = Vec::new();
574
575 args.push(self.array.unwrap_or_else(|| {
577 Logic::literal(crate::value::DataValue::array(self.arena, &[]), self.arena)
578 }));
579
580 if let Some(ascending) = self.ascending {
582 args.push(ascending);
583 if let Some(extractor) = self.extractor {
585 args.push(extractor);
586 }
587 } else if let Some(extractor) = self.extractor {
588 let default_asc = Logic::literal(crate::value::DataValue::bool(true), self.arena);
590 args.push(default_asc);
591 args.push(extractor);
592 }
593
594 Logic::operator(OperatorType::Array(ArrayOp::Sort), args, self.arena)
595 }
596}