1use num::{BigRational, FromPrimitive, ToPrimitive};
2use std::fmt;
3
4#[derive(Debug, Clone, Copy, Default, Eq, PartialEq, Hash)]
6pub enum Ty {
7 #[default]
8 Rational,
9 Bool,
10}
11
12impl Ty {
13 pub fn all() -> &'static [Ty] {
14 &[Ty::Rational, Ty::Bool]
15 }
16
17 pub fn make_default(&self) -> TyValue {
18 match self {
19 Ty::Rational => TyValue::Rational(BigRational::from_usize(0).unwrap()),
20 Ty::Bool => TyValue::Bool(false),
21 }
22 }
23}
24
25#[derive(Debug, Clone, Eq, PartialEq, Hash)]
27pub enum TyValue {
28 Rational(BigRational),
29 Bool(bool),
30}
31
32impl Default for TyValue {
33 fn default() -> Self {
34 TyValue::Rational(BigRational::from_usize(0).unwrap())
35 }
36}
37
38impl TyValue {
39 pub fn ty(&self) -> Ty {
40 match self {
41 TyValue::Rational(_) => Ty::Rational,
42 TyValue::Bool(_) => Ty::Bool,
43 }
44 }
45
46 pub fn to_usize(&self) -> Option<usize> {
47 match self {
48 TyValue::Rational(v) => v.to_usize(),
49 _ => None,
50 }
51 }
52 pub fn to_f32(&self) -> Option<f32> {
53 match self {
54 TyValue::Rational(v) => v.to_f32(),
55 _ => None,
56 }
57 }
58 pub fn to_f64(&self) -> Option<f64> {
59 match self {
60 TyValue::Rational(v) => v.to_f64(),
61 _ => None,
62 }
63 }
64}
65
66impl fmt::Display for TyValue {
67 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
68 use TyValue::*;
69 match self {
70 Rational(v) => write!(f, "{}", v),
71 Bool(v) => write!(f, "{}", v),
72 }
73 }
74}
75
76impl From<BigRational> for TyValue {
77 fn from(input: BigRational) -> Self {
78 TyValue::Rational(input)
79 }
80}
81impl From<usize> for TyValue {
82 fn from(input: usize) -> Self {
83 TyValue::Rational(BigRational::from_usize(input).unwrap())
84 }
85}
86impl From<isize> for TyValue {
87 fn from(input: isize) -> Self {
88 TyValue::Rational(BigRational::from_isize(input).unwrap())
89 }
90}
91impl From<u32> for TyValue {
92 fn from(input: u32) -> Self {
93 TyValue::Rational(BigRational::from_u32(input).unwrap())
94 }
95}
96impl From<i32> for TyValue {
97 fn from(input: i32) -> Self {
98 TyValue::Rational(BigRational::from_i32(input).unwrap())
99 }
100}
101impl From<u64> for TyValue {
102 fn from(input: u64) -> Self {
103 TyValue::Rational(BigRational::from_u64(input).unwrap())
104 }
105}
106impl From<i64> for TyValue {
107 fn from(input: i64) -> Self {
108 TyValue::Rational(BigRational::from_i64(input).unwrap())
109 }
110}
111impl From<f32> for TyValue {
112 fn from(input: f32) -> Self {
113 TyValue::Rational(BigRational::from_f32(input).unwrap())
114 }
115}
116impl From<f64> for TyValue {
117 fn from(input: f64) -> Self {
118 TyValue::Rational(BigRational::from_f64(input).unwrap())
119 }
120}
121
122impl From<bool> for TyValue {
123 fn from(input: bool) -> Self {
124 TyValue::Bool(input)
125 }
126}