1use num_complex::{Complex32, Complex64};
5
6use std::{
7 fmt,
8 ops::{Add, Neg},
9};
10#[derive(Debug, Copy, Clone, PartialEq, Eq, Default)]
12pub struct Pattern;
13
14impl Add for Pattern {
15 type Output = Pattern;
16 fn add(self, _other: Pattern) -> Pattern {
17 Pattern {}
18 }
19}
20impl Neg for Pattern {
21 type Output = Pattern;
22 fn neg(self) -> Pattern {
23 Pattern {}
24 }
25}
26
27#[derive(Debug, Copy, Clone, PartialEq, Eq)]
28pub enum NumKind {
29 Integer,
30 Float,
31 Complex,
32 Pattern,
33}
34
35impl fmt::Display for NumKind {
36 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
37 match self {
38 Self::Integer => write!(f, "integer"),
39 Self::Float => write!(f, "real"),
40 Self::Complex => write!(f, "complex"),
41 Self::Pattern => write!(f, "pattern"),
42 }
43 }
44}
45
46pub trait PrimitiveKind {
47 fn num_kind() -> NumKind;
50}
51impl PrimitiveKind for Pattern {
52 fn num_kind() -> NumKind {
53 NumKind::Pattern
54 }
55}
56
57macro_rules! integer_prim_kind_impl {
58 ($prim: ty) => {
59 impl PrimitiveKind for $prim {
60 fn num_kind() -> NumKind {
61 NumKind::Integer
62 }
63 }
64 };
65}
66
67integer_prim_kind_impl!(i8);
68integer_prim_kind_impl!(u8);
69integer_prim_kind_impl!(i16);
70integer_prim_kind_impl!(u16);
71integer_prim_kind_impl!(i32);
72integer_prim_kind_impl!(u32);
73integer_prim_kind_impl!(i64);
74integer_prim_kind_impl!(u64);
75integer_prim_kind_impl!(isize);
76integer_prim_kind_impl!(usize);
77
78macro_rules! float_prim_kind_impl {
79 ($prim: ty) => {
80 impl PrimitiveKind for $prim {
81 fn num_kind() -> NumKind {
82 NumKind::Float
83 }
84 }
85 };
86}
87
88float_prim_kind_impl!(f32);
89float_prim_kind_impl!(f64);
90
91macro_rules! complex_prim_kind_impl {
92 ($prim: ty) => {
93 impl PrimitiveKind for $prim {
94 fn num_kind() -> NumKind {
95 NumKind::Complex
96 }
97 }
98 };
99}
100
101complex_prim_kind_impl!(Complex32);
102complex_prim_kind_impl!(Complex64);