proto_vulcan/relation/
first.rs1use crate::engine::Engine;
2use crate::goal::{AnyGoal, InferredGoal};
3use crate::lterm::LTerm;
4use crate::relation::cons;
5use crate::user::User;
6
7pub fn first<U, E, G>(list: LTerm<U, E>, first: LTerm<U, E>) -> InferredGoal<U, E, G>
9where
10 U: User,
11 E: Engine<U>,
12 G: AnyGoal<U, E>,
13{
14 proto_vulcan!(|rest| { cons(first, rest, list) })
15}
16
17#[cfg(test)]
18mod test {
19 use super::first;
20 use crate::prelude::*;
21
22 #[test]
23 fn test_first_1() {
24 let query = proto_vulcan_query!(|q| { first([1], q) });
25 let mut iter = query.run();
26 assert!(iter.next().unwrap().q == 1);
27 assert!(iter.next().is_none());
28 }
29
30 #[test]
31 fn test_first_2() {
32 let query = proto_vulcan_query!(|q| { first([1, 2], q) });
33 let mut iter = query.run();
34 assert!(iter.next().unwrap().q == 1);
35 assert!(iter.next().is_none());
36 }
37
38 #[test]
39 fn test_first_3() {
40 let query = proto_vulcan_query!(|q| { first([1, 2, 3], q) });
41 let mut iter = query.run();
42 assert!(iter.next().unwrap().q == 1);
43 assert!(iter.next().is_none());
44 }
45
46 #[test]
47 fn test_first_4() {
48 let query = proto_vulcan_query!(|q| { first([[1, 2], 3], q) });
49 let mut iter = query.run();
50 assert!(iter.next().unwrap().q == lterm!([1, 2]));
51 assert!(iter.next().is_none());
52 }
53}