hugr_model/v0/ast/
view.rs

1use std::sync::Arc;
2
3use super::{LinkName, Node, Operation, Param, Region, SeqPart, Symbol, SymbolName, Term, VarName};
4use crate::v0::table::{self, NodeId, TermId, VarId, View};
5
6impl<'a> View<'a, TermId> for Term {
7    fn view(module: &'a table::Module<'a>, id: TermId) -> Option<Self> {
8        let term = module.get_term(id)?;
9        Some(match term {
10            table::Term::Wildcard => Term::Wildcard,
11            table::Term::Var(var) => Term::Var(module.view(*var)?),
12            table::Term::Apply(symbol, terms) => {
13                let symbol = module.view(*symbol)?;
14                let terms = module.view(*terms)?;
15                Term::Apply(symbol, terms)
16            }
17            table::Term::Func(region_id) => Term::Func(Arc::new(module.view(*region_id)?)),
18            table::Term::List(list_parts) => Term::List(module.view(*list_parts)?),
19            table::Term::Literal(literal) => Term::Literal(literal.clone()),
20            table::Term::Tuple(tuple_parts) => Term::List(module.view(*tuple_parts)?),
21        })
22    }
23}
24
25impl<'a> View<'a, NodeId> for Node {
26    fn view(module: &'a table::Module<'a>, id: NodeId) -> Option<Self> {
27        let node = module.get_node(id)?;
28
29        let operation = match node.operation {
30            table::Operation::Invalid => Operation::Invalid,
31            table::Operation::Dfg => Operation::Dfg,
32            table::Operation::Cfg => Operation::Cfg,
33            table::Operation::Block => Operation::Block,
34            table::Operation::DefineFunc(symbol) => {
35                Operation::DefineFunc(Box::new(module.view(*symbol)?))
36            }
37            table::Operation::DeclareFunc(symbol) => {
38                Operation::DeclareFunc(Box::new(module.view(*symbol)?))
39            }
40            table::Operation::Custom(operation) => Operation::Custom(module.view(operation)?),
41            table::Operation::DefineAlias(symbol, value) => {
42                let symbol = Box::new(module.view(*symbol)?);
43                let value = module.view(value)?;
44                Operation::DefineAlias(symbol, value)
45            }
46            table::Operation::DeclareAlias(symbol) => {
47                Operation::DeclareAlias(Box::new(module.view(*symbol)?))
48            }
49            table::Operation::DeclareConstructor(symbol) => {
50                Operation::DeclareConstructor(Box::new(module.view(*symbol)?))
51            }
52            table::Operation::DeclareOperation(symbol) => {
53                Operation::DeclareOperation(Box::new(module.view(*symbol)?))
54            }
55            table::Operation::TailLoop => Operation::TailLoop,
56            table::Operation::Conditional => Operation::Conditional,
57            table::Operation::Import { name } => Operation::Import(SymbolName::new(name)),
58        };
59
60        let meta = module.view(node.meta)?;
61        let signature = module.view(node.signature)?;
62        let inputs = module.view(node.inputs)?;
63        let outputs = module.view(node.outputs)?;
64        let regions = module.view(node.regions)?;
65
66        Some(Node {
67            operation,
68            inputs,
69            outputs,
70            regions,
71            meta,
72            signature,
73        })
74    }
75}
76
77impl<'a> View<'a, table::LinkIndex> for LinkName {
78    fn view(_module: &'a table::Module<'a>, index: table::LinkIndex) -> Option<Self> {
79        Some(LinkName::new_index(index))
80    }
81}
82
83impl<'a> View<'a, table::SeqPart> for SeqPart {
84    fn view(module: &'a table::Module<'a>, part: table::SeqPart) -> Option<Self> {
85        Some(match part {
86            table::SeqPart::Item(term_id) => SeqPart::Item(module.view(term_id)?),
87            table::SeqPart::Splice(term_id) => SeqPart::Splice(module.view(term_id)?),
88        })
89    }
90}
91
92impl<'a> View<'a, table::Symbol<'a>> for Symbol {
93    fn view(module: &'a table::Module<'a>, id: table::Symbol<'a>) -> Option<Self> {
94        let name = SymbolName::new(id.name);
95        let params = module.view(id.params)?;
96        let constraints = module.view(id.constraints)?;
97        let signature = module.view(id.signature)?;
98        Some(Symbol {
99            name,
100            params,
101            constraints,
102            signature,
103        })
104    }
105}
106
107impl<'a> View<'a, table::Param<'a>> for Param {
108    fn view(module: &'a table::Module<'a>, param: table::Param<'a>) -> Option<Self> {
109        let name = VarName::new(param.name);
110        let r#type = module.view(param.r#type)?;
111        Some(Param { name, r#type })
112    }
113}
114
115impl<'a> View<'a, table::RegionId> for Region {
116    fn view(module: &'a table::Module<'a>, id: table::RegionId) -> Option<Self> {
117        let region = module.get_region(id)?;
118        let sources = module.view(region.sources)?;
119        let targets = module.view(region.targets)?;
120        let meta = module.view(region.meta)?;
121        let children = module.view(region.children)?;
122        let signature = module.view(region.signature)?;
123
124        Some(Region {
125            kind: region.kind,
126            sources,
127            targets,
128            children,
129            meta,
130            signature,
131        })
132    }
133}
134
135impl<'a> View<'a, VarId> for VarName {
136    fn view(module: &'a table::Module<'a>, id: VarId) -> Option<Self> {
137        let node = module.get_node(id.0)?;
138
139        let symbol = match node.operation {
140            table::Operation::DefineFunc(symbol) => symbol,
141            table::Operation::DeclareFunc(symbol) => symbol,
142            table::Operation::DefineAlias(symbol, _) => symbol,
143            table::Operation::DeclareAlias(symbol) => symbol,
144            table::Operation::DeclareConstructor(symbol) => symbol,
145            table::Operation::DeclareOperation(symbol) => symbol,
146            _ => return None,
147        };
148
149        let param = &symbol.params[id.1 as usize];
150        Some(Self(param.name.into()))
151    }
152}
153
154impl<'a> View<'a, NodeId> for SymbolName {
155    fn view(module: &'a table::Module<'a>, id: NodeId) -> Option<Self> {
156        let node = module.get_node(id)?;
157        let name = node.operation.symbol()?;
158        Some(Self(name.into()))
159    }
160}