kind_tree/concrete/
pat.rs1use std::fmt::{Display, Error, Formatter};
7
8use kind_span::Range;
9
10use crate::symbol::{Ident, QualifiedIdent};
11
12#[derive(Clone, Debug, Hash, PartialEq, Eq)]
14pub struct PatIdent(pub Ident);
15
16#[derive(Clone, Debug, Hash, PartialEq, Eq)]
17pub enum PatKind {
18 Var(PatIdent),
20 App(QualifiedIdent, Vec<Box<Pat>>),
22 U60(u64),
24 U120(u128),
26 F60(u64),
28 Pair(Box<Pat>, Box<Pat>),
30 List(Vec<Pat>),
32 Str(String),
34 Char(char),
36 Hole,
38}
39
40#[derive(Clone, Debug, Hash, PartialEq, Eq)]
42pub struct Pat {
43 pub data: PatKind,
44 pub range: Range,
45}
46
47impl Display for Pat {
48 fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
49 use PatKind::*;
50 match &self.data {
51 Var(name) => write!(f, "{}", name.0),
52 App(head, spine) => write!(
53 f,
54 "({}{})",
55 head,
56 spine.iter().map(|x| format!(" {}", x)).collect::<String>()
57 ),
58 List(vec) => write!(
59 f,
60 "[{}]",
61 vec.iter()
62 .map(|x| format!("{}", x))
63 .collect::<Vec<String>>()
64 .join(" ")
65 ),
66 Str(str) => write!(f, "\"{}\"", str),
67 U60(num) => write!(f, "{}", num),
68 U120(num) => write!(f, "{}u120", num),
69 F60(_num) => todo!(),
70 Char(chr) => write!(f, "\'{}\'", chr),
71 Pair(fst, snd) => write!(f, "({}, {})", fst, snd),
72 Hole => write!(f, "_"),
73 }
74 }
75}
76
77impl Pat {
78 pub fn var(name: Ident) -> Box<Pat> {
79 Box::new(Pat {
80 range: name.range,
81 data: PatKind::Var(PatIdent(name)),
82 })
83 }
84}