1#[macro_use]
2use crate::parser::*;
3use crate::*;
4use crate::label;
5use crate::labelr;
6use nom::{
7 multi::separated_list0,
8 sequence::tuple as nom_tuple,
9};
10use crate::nodes::Kind;
11
12macro_rules! leaf {
13 ($name:ident, $byte:expr, $token:expr) => (
14 pub fn $name(input: ParseString) -> ParseResult<Token> {
15 if input.is_empty() {
16 return Err(nom::Err::Error(ParseError::new(input, "Unexpected eof")))
17 }
18 let start = input.loc();
19 let byte = input.graphemes[input.cursor];
20 let (input, _) = tag($byte)(input)?;
21 let end = input.loc();
22 let src_range = SourceRange { start, end };
23 Ok((input, Token{kind: $token, chars: $byte.chars().collect::<Vec<char>>(), src_range}))
24 }
25 )
26}
27
28macro_rules! ws0_leaf {
29 ($name:ident, $byte:expr, $token:expr) => (
30 pub fn $name(input: ParseString) -> ParseResult<Token> {
31 if input.is_empty() {
32 return Err(nom::Err::Error(ParseError::new(input, "Unexpected eof")))
33 }
34 let start = input.loc();
35 let byte = input.graphemes[input.cursor];
36 let (input, _) = whitespace0(input)?;
37 let (input, _) = tag($byte)(input)?;
38 let (input, _) = whitespace0(input)?;
39 let end = input.loc();
40 let src_range = SourceRange { start, end };
41 Ok((input, Token{kind: $token, chars: $byte.chars().collect::<Vec<char>>(), src_range}))
42 }
43 )
44}
45
46macro_rules! ws1_leaf {
47 ($name:ident, $byte:expr, $token:expr) => (
48 pub fn $name(input: ParseString) -> ParseResult<Token> {
49 if input.is_empty() {
50 return Err(nom::Err::Error(ParseError::new(input, "Unexpected eof")))
51 }
52 let (input, _) = whitespace1(input)?;
53 let start = input.loc();
54 let byte = input.graphemes[input.cursor];
55 let (input, _) = tag($byte)(input)?;
56 let end = input.loc();
57 let (input, _) = whitespace1(input)?;
58 let src_range = SourceRange { start, end };
59 Ok((input, Token{kind: $token, chars: $byte.chars().collect::<Vec<char>>(), src_range}))
60 }
61 )
62}
63
64leaf!{at, "@", TokenKind::At}
65leaf!{hashtag, "#", TokenKind::HashTag}
66leaf!{period, ".", TokenKind::Period}
67leaf!{colon, ":", TokenKind::Colon}
68leaf!{comma, ",", TokenKind::Comma}
69leaf!{percent, "%", TokenKind::Percent}
70leaf!{apostrophe, "'", TokenKind::Apostrophe}
71leaf!{left_bracket, "[", TokenKind::LeftBracket}
72leaf!{right_bracket, "]", TokenKind::RightBracket}
73leaf!{left_parenthesis, "(", TokenKind::LeftParenthesis}
74leaf!{right_parenthesis, ")", TokenKind::RightParenthesis}
75leaf!{left_brace, "{", TokenKind::LeftBrace}
76leaf!{right_brace, "}", TokenKind::RightBrace}
77leaf!{dollar, "$", TokenKind::Dollar}
78leaf!{equal, "=", TokenKind::Equal}
79leaf!{left_angle, "<", TokenKind::LeftAngle}
80leaf!{right_angle, ">", TokenKind::RightAngle}
81leaf!{exclamation, "!", TokenKind::Exclamation}
82leaf!{question, "?", TokenKind::Question}
83leaf!{plus, "+", TokenKind::Plus}
84leaf!{dash, "-", TokenKind::Dash}
85leaf!{underscore, "_", TokenKind::Underscore}
86leaf!{asterisk, "*", TokenKind::Asterisk}
87leaf!{slash, "/", TokenKind::Slash}
88leaf!{backslash, "\\", TokenKind::Backslash}
89leaf!{caret, "^", TokenKind::Caret}
90leaf!{space, " ", TokenKind::Space}
91leaf!{tab, "\t", TokenKind::Tab}
92leaf!{tilde, "~", TokenKind::Tilde}
93leaf!{grave, "`", TokenKind::Grave}
94leaf!{bar, "|", TokenKind::Bar}
95leaf!{quote, "\"", TokenKind::Quote}
96leaf!{ampersand, "&", TokenKind::Ampersand}
97leaf!{semicolon, ";", TokenKind::Semicolon}
98leaf!{new_line_char, "\n", TokenKind::Newline}
99leaf!{carriage_return, "\r", TokenKind::CarriageReturn}
100leaf!{carriage_return_new_line, "\r\n", TokenKind::CarriageReturn}
101leaf!{english_true_literal, "true", TokenKind::True}
102leaf!{english_false_literal, "false", TokenKind::False}
103leaf!{check_mark, "✓", TokenKind::True}
104leaf!{cross, "✗", TokenKind::False}
105leaf!{negate, "¬", TokenKind::Not}
106
107leaf!{box_tl_round, "╭", TokenKind::BoxDrawing}
108leaf!{box_tr_round, "╮", TokenKind::BoxDrawing}
109leaf!{box_bl_round, "╰", TokenKind::BoxDrawing}
110leaf!{box_br_round, "╯", TokenKind::BoxDrawing}
111
112leaf!{box_tl_bold, "┏", TokenKind::BoxDrawing}
113leaf!{box_tr_bold, "┓", TokenKind::BoxDrawing}
114leaf!{box_bl_bold, "┗", TokenKind::BoxDrawing}
115leaf!{box_br_bold, "┛", TokenKind::BoxDrawing}
116
117leaf!{box_tl, "┌", TokenKind::BoxDrawing}
118leaf!{box_tr, "┐", TokenKind::BoxDrawing}
119leaf!{box_bl, "└", TokenKind::BoxDrawing}
120leaf!{box_br, "┘", TokenKind::BoxDrawing}
121
122leaf!{box_cross, "┼", TokenKind::BoxDrawing}
123leaf!{box_horz, "─", TokenKind::BoxDrawing}
124leaf!{box_t_left, "├", TokenKind::BoxDrawing}
125leaf!{box_t_right, "┤", TokenKind::BoxDrawing}
126leaf!{box_t_top, "┬", TokenKind::BoxDrawing}
127leaf!{box_t_bottom, "┴", TokenKind::BoxDrawing}
128leaf!{box_vert, "│", TokenKind::BoxDrawing}
129leaf!{box_vert_bold, "┃", TokenKind::BoxDrawing}
130
131leaf!(http_prefix, "http", TokenKind::HttpPrefix);
132leaf!(img_prefix, "![", TokenKind::ImgPrefix);
133leaf!(footnote_prefix, "[^", TokenKind::FootnotePrefix);
134leaf!(abstract_prefix, "%%", TokenKind::AbstractPrefix);
135
136ws0_leaf!(define_operator, ":=", TokenKind::DefineOperator);
137ws0_leaf!(assign_operator, "=", TokenKind::AssignOperator);
138ws0_leaf!(output_operator, "=>", TokenKind::OutputOperator);
139ws0_leaf!(async_transition_operator, "~>", TokenKind::AsyncTransitionOperator);
140ws0_leaf!(transition_operator, "->", TokenKind::TransitionOperator);
141
142
143pub fn emoji_grapheme(mut input: ParseString) -> ParseResult<String> {
145 if let Some(matched) = input.consume_emoji() {
146 Ok((input, matched))
147 } else {
148 Err(nom::Err::Error(ParseError::new(input, "Unexpected character")))
149 }
150}
151
152pub fn alpha(mut input: ParseString) -> ParseResult<String> {
154 if let Some(matched) = input.consume_alpha() {
155 Ok((input, matched))
156 } else {
157 Err(nom::Err::Error(ParseError::new(input, "Unexpected character")))
158 }
159}
160
161pub fn digit(mut input: ParseString) -> ParseResult<String> {
163 if let Some(matched) = input.consume_digit() {
164 Ok((input, matched))
165 } else {
166 Err(nom::Err::Error(ParseError::new(input, "Unexpected character")))
167 }
168}
169
170pub fn any(mut input: ParseString) -> ParseResult<String> {
172 if let Some(matched) = input.consume_one() {
173 Ok((input, matched))
174 } else {
175 Err(nom::Err::Error(ParseError::new(input, "Unexpected eof")))
176 }
177}
178
179pub fn any_token(mut input: ParseString) -> ParseResult<Token> {
180 if input.is_empty() {
181 return Err(nom::Err::Error(ParseError::new(input, "Unexpected eof")))
182 }
183 let start = input.loc();
184 let byte = input.graphemes[input.cursor];
185 if let Some(matched) = input.consume_one() {
186 let end = input.loc();
187 let src_range = SourceRange { start, end };
188 Ok((input, Token{kind: TokenKind::Any, chars: byte.chars().collect::<Vec<char>>(), src_range}))
189 } else {
190 Err(nom::Err::Error(ParseError::new(input, "Unexpected eof")))
191 }
192}
193
194pub fn forbidden_emoji(input: ParseString) -> ParseResult<Token> {
196 alt((box_tl, box_br, box_bl, box_tr, box_tr_bold, box_tl_bold, box_br_bold, box_bl_bold, box_t_left,box_tl_round,box_br_round, box_tr_round, box_bl_round, box_vert, box_cross, box_horz, box_t_right, box_t_top, box_t_bottom))(input)
197}
198
199pub fn emoji(input: ParseString) -> ParseResult<Token> {
201 let msg1 = "Cannot be a box-drawing emoji";
202 let start = input.loc();
203 let (input, _) = is_not(forbidden_emoji)(input)?;
204 let (input, g) = emoji_grapheme(input)?;
205 let end = input.loc();
206 let src_range = SourceRange { start, end };
207 Ok((input, Token{kind: TokenKind::Emoji, chars: g.chars().collect::<Vec<char>>(), src_range}))
208}
209
210pub fn alpha_token(input: ParseString) -> ParseResult<Token> {
212 let (input, (g, src_range)) = range(alpha)(input)?;
213 Ok((input, Token{kind: TokenKind::Alpha, chars: g.chars().collect::<Vec<char>>(), src_range}))
214}
215
216pub fn digit_token(input: ParseString) -> ParseResult<Token> {
218 let (input, (g, src_range)) = range(digit)(input)?;
219 Ok((input, Token{kind: TokenKind::Digit, chars: g.chars().collect::<Vec<char>>(), src_range}))
220}
221
222pub fn underscore_digit(input: ParseString) -> ParseResult<Token> {
224 let (input, _) = underscore(input)?;
225 let (input, digit) = digit_token(input)?;
226 Ok((input,digit))
227}
228
229pub fn digit_sequence(input: ParseString) -> ParseResult<Vec<Token>> {
231 let (input, mut start) = digit_token(input)?;
232 let (input, mut tokens) = many0(alt((underscore_digit,digit_token)))(input)?;
233 let mut all = vec![start];
234 all.append(&mut tokens);
235 Ok((input,all))
236}
237
238pub fn grouping_symbol(input: ParseString) -> ParseResult<Token> {
240 let (input, grouping) = alt((left_parenthesis, right_parenthesis, left_angle, right_angle, left_brace, right_brace, left_bracket, right_bracket))(input)?;
241 Ok((input, grouping))
242}
243
244pub fn punctuation(input: ParseString) -> ParseResult<Token> {
246 let (input, punctuation) = alt((period, exclamation, question, comma, colon, semicolon, quote, apostrophe))(input)?;
247 Ok((input, punctuation))
248}
249
250pub fn escaped_char(input: ParseString) -> ParseResult<Token> {
252 let (input, _) = backslash(input)?;
253 let (input, symbol) = alt((symbol, punctuation))(input)?;
254 Ok((input, symbol))
255}
256
257pub fn symbol(input: ParseString) -> ParseResult<Token> {
259 let (input, symbol) = alt((ampersand, bar, percent, at, slash, hashtag, equal, backslash, tilde, plus, dash, asterisk, caret, underscore))(input)?;
260 Ok((input, symbol))
261}
262
263pub fn text(input: ParseString) -> ParseResult<Token> {
265 let (input, text) = alt((alpha_token, digit_token, emoji, forbidden_emoji, space, tab, escaped_char, punctuation, grouping_symbol, symbol))(input)?;
266 Ok((input, text))
267}
268
269pub fn identifier(input: ParseString) -> ParseResult<Identifier> {
271 let (input, (first, mut rest)) = nom_tuple((alt((alpha_token, emoji)), many0(alt((alpha_token, digit_token, symbol, emoji)))))(input)?;
272 let mut tokens = vec![first];
273 tokens.append(&mut rest);
274 let mut merged = Token::merge_tokens(&mut tokens).unwrap();
275 merged.kind = TokenKind::Identifier;
276 Ok((input, Identifier{name: merged}))
277}
278
279pub fn boolean(input: ParseString) -> ParseResult<Token> {
281 let (input, boolean) = alt((true_literal, false_literal))(input)?;
282 Ok((input, boolean))
283}
284
285pub fn true_literal(input: ParseString) -> ParseResult<Token> {
287 let (input, token) = alt((english_true_literal, check_mark))(input)?;
288 Ok((input, token))
289}
290
291pub fn false_literal(input: ParseString) -> ParseResult<Token> {
293 let (input, token) = alt((english_false_literal, cross))(input)?;
294 Ok((input, token))
295}
296
297pub fn new_line(input: ParseString) -> ParseResult<Token> {
299 let (input, result) = alt((carriage_return_new_line,new_line_char,carriage_return))(input)?;
300 Ok((input, result))
301}
302
303pub fn whitespace(input: ParseString) -> ParseResult<Token> {
305 let (input, space) = alt((space,tab,new_line))(input)?;
306 Ok((input, space))
307}
308
309pub fn whitespace0(input: ParseString) -> ParseResult<()> {
311 let (input, _) = many0(whitespace)(input)?;
312 Ok((input, ()))
313}
314
315pub fn whitespace1(input: ParseString) -> ParseResult<()> {
317 let (input, _) = many1(whitespace)(input)?;
318 Ok((input, ()))
319}
320
321pub fn space_tab(input: ParseString) -> ParseResult<Token> {
323 let (input, space) = alt((space,tab))(input)?;
324 Ok((input, space))
325}
326
327pub fn list_separator(input: ParseString) -> ParseResult<()> {
329 let (input,_) = nom_tuple((whitespace0,tag(","),whitespace0))(input)?;
330 Ok((input, ()))
331}
332
333pub fn enum_separator(input: ParseString) -> ParseResult<()> {
335 let (input,_) = nom_tuple((whitespace0,tag("|"),whitespace0))(input)?;
336 Ok((input, ()))
337}
338
339
340pub fn number(input: ParseString) -> ParseResult<Number> {
343 let (input, real_num) = real_number(input)?;
344 match tag("i")(input.clone()) {
345 Ok((input,_)) => {
346 return Ok((input, Number::Imaginary(
347 ComplexNumber{
348 real: None,
349 imaginary: ImaginaryNumber{number: real_num}
350 })));
351 }
352 _ => match nom_tuple((plus,real_number,tag("i")))(input.clone()) {
353 Ok((input, (_,imaginary_num,_))) => {
354 return Ok((input, Number::Imaginary(
355 ComplexNumber{
356 real: Some(real_num),
357 imaginary: ImaginaryNumber{number: imaginary_num},
358 })));
359 }
360 _ => ()
361 }
362 }
363 Ok((input, Number::Real(real_num)))
364}
365
366pub fn real_number(input: ParseString) -> ParseResult<RealNumber> {
368 let (input, neg) = opt(dash)(input)?;
369 let (input, result) = alt((hexadecimal_literal, decimal_literal, octal_literal, binary_literal, scientific_literal, rational_literal, float_literal, integer_literal))(input)?;
370 let result = match neg {
371 Some(_) => RealNumber::Negated(Box::new(result)),
372 None => result,
373 };
374 Ok((input, result))
375}
376
377pub fn rational_literal(input: ParseString) -> ParseResult<RealNumber> {
379 let (input, RealNumber::Integer(numerator)) = integer_literal(input)? else { unreachable!() };
380 let (input, _) = slash(input)?;
381 let (input, RealNumber::Integer(denominator)) = integer_literal(input)? else { unreachable!() };
382 Ok((input, RealNumber::Rational((numerator,denominator))))
383}
384
385pub fn scientific_literal(input: ParseString) -> ParseResult<RealNumber> {
387 let (input, base) = match float_literal(input.clone()) {
388 Ok((input, RealNumber::Float(base))) => {
389 (input, base)
390 }
391 _ => match integer_literal(input.clone()) {
392 Ok((input, RealNumber::Integer(base))) => {
393 (input, (base, Token::default()))
394 }
395 Err(err) => {return Err(err);}
396 _ => unreachable!(),
397 }
398 };
399 let (input, _) = alt((tag("e"), tag("E")))(input)?;
400 let (input, _) = opt(plus)(input)?;
401 let (input, neg) = opt(dash)(input)?;
402 let (input, (ex_whole,ex_part)) = match float_literal(input.clone()) {
403 Ok((input, RealNumber::Float(exponent))) => {
404 (input, exponent)
405 }
406 _ => match integer_literal(input.clone()) {
407 Ok((input, RealNumber::Integer(exponent))) => {
408 (input, (exponent, Token::default()))
409 }
410 Err(err) => {return Err(err);}
411 _ => unreachable!(),
412 }
413 };
414 let ex_sign = match neg {
415 Some(_) => true,
416 None => false,
417 };
418 Ok((input, RealNumber::Scientific((base,(ex_sign,ex_whole,ex_part)))))
419}
420
421pub fn float_decimal_start(input: ParseString) -> ParseResult<RealNumber> {
423 let (input, _) = period(input)?;
424 let (input, part) = digit_sequence(input)?;
425 let mut tokens2 = part.clone();
426 let mut merged = Token::merge_tokens(&mut tokens2).unwrap();
427 merged.kind = TokenKind::Number;
428 Ok((input, RealNumber::Float((Token::default(),merged))))
429}
430
431pub fn float_full(input: ParseString) -> ParseResult<RealNumber> {
433 let (input, mut whole) = digit_sequence(input)?;
434 let (input, _) = period(input)?;
435 let (input, mut part) = digit_sequence(input)?;
436 let mut whole = Token::merge_tokens(&mut whole).unwrap();
437 let mut part = Token::merge_tokens(&mut part).unwrap();
438 whole.kind = TokenKind::Number;
439 part.kind = TokenKind::Number;
440 Ok((input, RealNumber::Float((whole,part))))
441}
442
443pub fn float_literal(input: ParseString) -> ParseResult<RealNumber> {
445 let (input, result) = alt((float_decimal_start,float_full))(input)?;
446 Ok((input, result))
447}
448
449pub fn integer_literal(input: ParseString) -> ParseResult<RealNumber> {
451 let (input, mut digits) = digit_sequence(input)?;
452 let mut merged = Token::merge_tokens(&mut digits).unwrap();
453 merged.kind = TokenKind::Number;
454 Ok((input, RealNumber::Integer(merged)))
455}
456
457pub fn decimal_literal(input: ParseString) -> ParseResult<RealNumber> {
459 let msg = "Expects decimal digits after \"0d\"";
460 let input = tag("0d")(input);
461 let (input, _) = input?;
462 let (input, mut tokens) = label!(digit_sequence, msg)(input)?;
463 let mut merged = Token::merge_tokens(&mut tokens).unwrap();
464 merged.kind = TokenKind::Number;
465 Ok((input, RealNumber::Decimal(merged)))
466}
467
468pub fn hexadecimal_literal(input: ParseString) -> ParseResult<RealNumber> {
470 let msg = "Expects hexadecimal digits after \"0x\"";
471 let input = tag("0x")(input);
472 let (input, _) = input?;
473 let (input, mut tokens) = label!(many1(alt((digit_token,underscore,alpha_token))), msg)(input)?;
474 let mut merged = Token::merge_tokens(&mut tokens).unwrap();
475 merged.kind = TokenKind::Number;
476 Ok((input, RealNumber::Hexadecimal(merged)))
477}
478
479pub fn octal_literal(input: ParseString) -> ParseResult<RealNumber> {
481 let msg = "Expects octal digits after \"0o\"";
482 let input = tag("0o")(input);
483 let (input, _) = input?;
484 let (input, mut tokens) = label!(many1(alt((digit_token,underscore,alpha_token))), msg)(input)?;
485 let mut merged = Token::merge_tokens(&mut tokens).unwrap();
486 merged.kind = TokenKind::Number;
487 Ok((input, RealNumber::Octal(merged)))
488}
489
490pub fn binary_literal(input: ParseString) -> ParseResult<RealNumber> {
492 let msg = "Expects binary digits after \"0b\"";
493 let input = tag("0b")(input);
494 let (input, _) = input?;
495 let (input, mut tokens) = label!(many1(alt((digit_token,underscore,alpha_token))), msg)(input)?;
496 let mut merged = Token::merge_tokens(&mut tokens).unwrap();
497 merged.kind = TokenKind::Number;
498 Ok((input, RealNumber::Binary(merged)))
499}
500
501pub fn empty(input: ParseString) -> ParseResult<Token> {
503 let (input, (g, src_range)) = range(many1(tag("_")))(input)?;
504 Ok((input, Token{kind: TokenKind::Empty, chars: g.join("").chars().collect(), src_range}))
505}
506
507pub fn kind_annotation(input: ParseString) -> ParseResult<KindAnnotation> {
511 let msg2 = "Expects at least one unit in kind annotation";
512 let msg3 = "Expects right angle";
513 let (input, (_, r)) = range(left_angle)(input)?;
514 let (input, kind) = kind(input)?;
515 let (input, _) = label!(right_angle, msg3, r)(input)?;
516 Ok((input, KindAnnotation{ kind }))
517}
518
519pub fn kind(input: ParseString) -> ParseResult<Kind> {
521 let (input, kind) = alt((kind_fxn,kind_empty,kind_atom,kind_tuple,kind_scalar,kind_bracket,kind_map,kind_brace))(input)?;
522 Ok((input, kind))
523}
524
525pub fn kind_empty(input: ParseString) -> ParseResult<Kind> {
527 let (input, _) = many1(underscore)(input)?;
528 Ok((input, Kind::Empty))
529}
530
531pub fn kind_atom(input: ParseString) -> ParseResult<Kind> {
533 let (input, _) = grave(input)?;
534 let (input, atm) = identifier(input)?;
535 Ok((input, Kind::Atom(atm)))
536}
537
538pub fn kind_map(input: ParseString) -> ParseResult<Kind> {
540 let (input, _) = left_brace(input)?;
541 let (input, key_kind) = kind(input)?;
542 let (input, _) = colon(input)?;
543 let (input, value_kind) = kind(input)?;
544 let (input, _) = right_brace(input)?;
545 Ok((input, Kind::Map(Box::new(key_kind),Box::new(value_kind))))
546}
547
548pub fn kind_fxn(input: ParseString) -> ParseResult<Kind> {
550 let (input, _) = left_parenthesis(input)?;
551 let (input, input_kinds) = separated_list0(list_separator,kind)(input)?;
552 let (input, _) = right_parenthesis(input)?;
553 let (input, _) = equal(input)?;
554 let (input, _) = left_parenthesis(input)?;
555 let (input, output_kinds) = separated_list0(list_separator,kind)(input)?;
556 let (input, _) = right_parenthesis(input)?;
557 Ok((input, Kind::Function(input_kinds,output_kinds)))
558}
559
560pub fn kind_brace(input: ParseString) -> ParseResult<Kind> {
562 let (input, _) = left_brace(input)?;
563 let (input, kinds) = separated_list1(list_separator,kind)(input)?;
564 let (input, _) = right_brace(input)?;
565 let (input, _) = opt(colon)(input)?;
566 let (input, size) = separated_list0(list_separator,literal)(input)?;
567 Ok((input, Kind::Brace((kinds,size))))
568}
569
570pub fn kind_bracket(input: ParseString) -> ParseResult<Kind> {
572 let (input, _) = left_bracket(input)?;
573 let (input, kinds) = separated_list1(list_separator,kind)(input)?;
574 let (input, _) = right_bracket(input)?;
575 let (input, _) = opt(colon)(input)?;
576 let (input, size) = separated_list0(list_separator,literal)(input)?;
577 Ok((input, Kind::Bracket((kinds,size))))
578}
579
580pub fn kind_tuple(input: ParseString) -> ParseResult<Kind> {
582 let (input, _) = left_parenthesis(input)?;
583 let (input, kinds) = separated_list1(list_separator, kind)(input)?;
584 let (input, _) = right_parenthesis(input)?;
585 Ok((input, Kind::Tuple(kinds)))
586}
587
588pub fn kind_scalar(input: ParseString) -> ParseResult<Kind> {
590 let (input, kind) = identifier(input)?;
591 let (input, range) = opt(tuple((colon,range_expression)))(input)?;
592 Ok((input, Kind::Scalar(kind)))
593}