proto_vulcan/relation/
first.rs

1use crate::engine::Engine;
2use crate::goal::{AnyGoal, InferredGoal};
3use crate::lterm::LTerm;
4use crate::relation::cons;
5use crate::user::User;
6
7/// A relation such that the `first` is the first element of `list`.
8pub 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}