clean up compile_seq.
This commit is contained in:
@@ -466,7 +466,7 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<'a, TermMarker>
|
|||||||
code: &mut Code, is_exposed: bool)
|
code: &mut Code, is_exposed: bool)
|
||||||
-> Result<(), ParserError>
|
-> Result<(), ParserError>
|
||||||
{
|
{
|
||||||
for (chunk_num, _, terms) in iter
|
for (chunk_num, _, terms) in iter.rule_body_iter()
|
||||||
{
|
{
|
||||||
for (i, term) in terms.iter().enumerate()
|
for (i, term) in terms.iter().enumerate()
|
||||||
{
|
{
|
||||||
@@ -476,12 +476,6 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<'a, TermMarker>
|
|||||||
GenContext::Last(chunk_num)
|
GenContext::Last(chunk_num)
|
||||||
};
|
};
|
||||||
|
|
||||||
let term = if let &ChunkedTerm::BodyTerm(ref term) = term {
|
|
||||||
Ok(term)
|
|
||||||
} else {
|
|
||||||
Err(ParserError::InadmissibleQueryTerm)
|
|
||||||
}?;
|
|
||||||
|
|
||||||
match *term {
|
match *term {
|
||||||
&QueryTerm::Cut =>
|
&QueryTerm::Cut =>
|
||||||
code.push(if chunk_num == 0 {
|
code.push(if chunk_num == 0 {
|
||||||
|
|||||||
@@ -220,8 +220,29 @@ pub struct ChunkedIterator<'a>
|
|||||||
deep_cut_encountered: bool
|
deep_cut_encountered: bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ChunkedIteratorItem<'a> = (usize, usize, Vec<ChunkedTerm<'a>>);
|
||||||
|
type RuleBodyIteratorItem<'a> = (usize, usize, Vec<&'a QueryTerm>);
|
||||||
|
|
||||||
impl<'a> ChunkedIterator<'a>
|
impl<'a> ChunkedIterator<'a>
|
||||||
{
|
{
|
||||||
|
pub fn rule_body_iter(self) -> Box<Iterator<Item=RuleBodyIteratorItem<'a>> + 'a>
|
||||||
|
{
|
||||||
|
Box::new(self.filter_map(|(cn, lt_arity, terms)| {
|
||||||
|
let filtered_terms: Vec<_> = terms.into_iter().filter_map(|ct| {
|
||||||
|
match ct {
|
||||||
|
ChunkedTerm::BodyTerm(qt) => Some(qt),
|
||||||
|
_ => None
|
||||||
|
}
|
||||||
|
}).collect();
|
||||||
|
|
||||||
|
if filtered_terms.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some((cn, lt_arity, filtered_terms))
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
pub fn from_term_sequence(terms: &'a [QueryTerm]) -> Self
|
pub fn from_term_sequence(terms: &'a [QueryTerm]) -> Self
|
||||||
{
|
{
|
||||||
ChunkedIterator {
|
ChunkedIterator {
|
||||||
@@ -285,7 +306,7 @@ impl<'a> ChunkedIterator<'a>
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
ChunkedTerm::BodyTerm(&QueryTerm::Clause(_, ClauseType::Inlined(_), _)) =>
|
ChunkedTerm::BodyTerm(&QueryTerm::Clause(_, ClauseType::Inlined(_), _)) =>
|
||||||
result.push(term),
|
result.push(term),
|
||||||
ChunkedTerm::BodyTerm(&QueryTerm::Clause(_, ClauseType::CallN, ref subterms)) => {
|
ChunkedTerm::BodyTerm(&QueryTerm::Clause(_, ClauseType::CallN, ref subterms)) => {
|
||||||
result.push(term);
|
result.push(term);
|
||||||
arity = subterms.len() + 1;
|
arity = subterms.len() + 1;
|
||||||
@@ -311,7 +332,7 @@ impl<'a> ChunkedIterator<'a>
|
|||||||
impl<'a> Iterator for ChunkedIterator<'a>
|
impl<'a> Iterator for ChunkedIterator<'a>
|
||||||
{
|
{
|
||||||
// the chunk number, last term arity, and vector of references.
|
// the chunk number, last term arity, and vector of references.
|
||||||
type Item = (usize, usize, Vec<ChunkedTerm<'a>>);
|
type Item = ChunkedIteratorItem<'a>;
|
||||||
|
|
||||||
fn next(&mut self) -> Option<Self::Item> {
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
self.iter.next().map(|term| self.take_chunk(term))
|
self.iter.next().map(|term| self.take_chunk(term))
|
||||||
|
|||||||
Reference in New Issue
Block a user