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