1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//! # PatternCompiler - pattern_to_string_group Methods
//!
//! This module contains method implementations for `PatternCompiler`.
//!
//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
use crate::Pattern;
use super::patterncompiler_type::PatternCompiler;
impl PatternCompiler {
/// Pretty-print a pattern to a string.
#[allow(dead_code)]
pub fn pattern_to_string(&self, pattern: &Pattern) -> String {
match pattern {
Pattern::Wild => "_".to_string(),
Pattern::Var(name) => name.clone(),
Pattern::Ctor(name, args) => {
if args.is_empty() {
name.clone()
} else {
let args_str: Vec<String> = args
.iter()
.map(|a| {
let s = self.pattern_to_string(&a.value);
if matches!(
& a.value, Pattern::Ctor(_, ref sub) if ! sub.is_empty()
) {
format!("({})", s)
} else {
s
}
})
.collect();
format!("{} {}", name, args_str.join(" "))
}
}
Pattern::Lit(lit) => format!("{}", lit),
Pattern::Or(left, right) => {
let ls = self.pattern_to_string(&left.value);
let rs = self.pattern_to_string(&right.value);
format!("{} | {}", ls, rs)
}
}
}
/// Convert patterns to a canonical form for comparison.
pub fn canonicalize(&self, pattern: &Pattern) -> String {
self.pattern_to_string(pattern)
}
}