fetish_lib/
term_pointer.rs

1use std::cmp::*;
2use std::fmt::*;
3use std::hash::*;
4use crate::type_id::*;
5use crate::displayable_with_state::*;
6use crate::interpreter_state::*;
7use crate::term_index::*;
8use crate::primitive_term_pointer::*;
9use crate::nonprimitive_term_pointer::*;
10
11///A pointer to an arbitrary primitive or non-primitive
12///term within an [`InterpreterState`].
13#[derive(Copy, Clone, PartialEq, Hash, Eq)]
14pub struct TermPointer {
15    pub type_id : TypeId,
16    pub index : TermIndex
17}
18
19impl DisplayableWithState for TermPointer {
20    fn display(&self, state : &InterpreterState) -> String {
21        let term = state.get(*self);
22        term.display(state)
23    }
24}
25
26impl From<NonPrimitiveTermPointer> for TermPointer {
27    fn from(term_ptr : NonPrimitiveTermPointer) -> Self {
28        TermPointer {
29            type_id : term_ptr.type_id,
30            index : TermIndex::NonPrimitive(term_ptr.index)
31        }
32    }
33}
34impl From<PrimitiveTermPointer> for TermPointer {
35    fn from(term_ptr : PrimitiveTermPointer) -> Self {
36        TermPointer {
37            type_id : term_ptr.type_id,
38            index : TermIndex::Primitive(term_ptr.index)
39        }
40    }
41}