Decision tree compilation of list patterns

This commit is contained in:
Ayaz Hafiz 2022-11-01 13:59:44 -05:00
parent da1d937277
commit ae71c7efe2
No known key found for this signature in database
GPG key ID: 0E2A37416A25EF58
7 changed files with 479 additions and 38 deletions

View file

@ -1,5 +1,5 @@
use crate::expr::{self, IntValue, WhenBranch};
use crate::pattern::{DestructType, ListPatterns};
use crate::pattern::DestructType;
use roc_collections::all::HumanIndex;
use roc_collections::VecMap;
use roc_error_macros::internal_error;
@ -344,23 +344,19 @@ fn sketch_pattern(pattern: &crate::pattern::Pattern) -> SketchedPattern {
}
List {
patterns: ListPatterns { patterns, opt_rest },
patterns,
list_var: _,
elem_var: _,
} => {
let list_arity = match opt_rest {
Some(i) => {
let before = *i;
let after = patterns.len() - before;
ListArity::Slice(before, after)
}
None => ListArity::Exact(patterns.len()),
};
let arity = patterns.arity();
let sketched_elem_patterns =
patterns.iter().map(|p| sketch_pattern(&p.value)).collect();
let sketched_elem_patterns = patterns
.patterns
.iter()
.map(|p| sketch_pattern(&p.value))
.collect();
SP::List(list_arity, sketched_elem_patterns)
SP::List(arity, sketched_elem_patterns)
}
AppliedTag {

View file

@ -6,6 +6,7 @@ use crate::num::{
ParsedNumResult,
};
use crate::scope::{PendingAbilitiesInScope, Scope};
use roc_exhaustive::ListArity;
use roc_module::ident::{Ident, Lowercase, TagName};
use roc_module::symbol::Symbol;
use roc_parse::ast::{self, StrLiteral, StrSegment};
@ -189,6 +190,17 @@ impl ListPatterns {
fn surely_exhaustive(&self) -> bool {
self.patterns.is_empty() && matches!(self.opt_rest, Some(0))
}
pub fn arity(&self) -> ListArity {
match self.opt_rest {
Some(i) => {
let before = i;
let after = self.patterns.len() - before;
ListArity::Slice(before, after)
}
None => ListArity::Exact(self.patterns.len()),
}
}
}
#[derive(Clone, Debug)]