1use std::sync::Arc;
7use std::sync::LazyLock;
8
9use mago_word::empty_word;
10use mago_word::word;
11
12use crate::ttype::atomic::TAtomic;
13use crate::ttype::atomic::array::TArray;
14use crate::ttype::atomic::array::keyed::TKeyedArray;
15use crate::ttype::atomic::callable::TCallable;
16use crate::ttype::atomic::callable::TCallableSignature;
17use crate::ttype::atomic::iterable::TIterable;
18use crate::ttype::atomic::mixed::TMixed;
19use crate::ttype::atomic::object::TObject;
20use crate::ttype::atomic::resource::TResource;
21use crate::ttype::atomic::scalar::TScalar;
22use crate::ttype::atomic::scalar::int::TInteger;
23use crate::ttype::atomic::scalar::string::TString;
24use crate::ttype::atomic::scalar::string::TStringLiteral;
25use crate::ttype::get_arraykey;
26use crate::ttype::get_mixed;
27
28use super::atomic::scalar::string::TStringCasing;
29
30pub const ONE_INT_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::literal_int(1));
32pub const ZERO_INT_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::literal_int(0));
34pub const MINUS_ONE_INT_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::literal_int(-1));
36pub const INT_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::int());
38pub const POSITIVE_INT_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::Integer(TInteger::positive()));
40pub const NON_POSITIVE_INT_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::Integer(TInteger::non_positive()));
42pub const NEGATIVE_INT_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::Integer(TInteger::negative()));
44pub const NON_NEGATIVE_INT_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::Integer(TInteger::non_negative()));
46pub const UNSPECIFIED_LITERAL_INT_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::Integer(TInteger::UnspecifiedLiteral));
48pub const STRING_ATOMIC: &TAtomic =
50 &TAtomic::Scalar(TScalar::String(TString::new(None, false, false, false, false, TStringCasing::Unspecified)));
51pub const LOWERCASE_STRING_ATOMIC: &TAtomic =
53 &TAtomic::Scalar(TScalar::String(TString::new(None, false, false, false, false, TStringCasing::Lowercase)));
54pub const UPPERCASE_STRING_ATOMIC: &TAtomic =
56 &TAtomic::Scalar(TScalar::String(TString::new(None, false, false, false, false, TStringCasing::Uppercase)));
57pub const NON_EMPTY_STRING_ATOMIC: &TAtomic =
59 &TAtomic::Scalar(TScalar::String(TString::new(None, false, false, true, false, TStringCasing::Unspecified)));
60pub const NON_EMPTY_LOWERCASE_STRING_ATOMIC: &TAtomic =
62 &TAtomic::Scalar(TScalar::String(TString::new(None, false, false, true, false, TStringCasing::Lowercase)));
63pub const NON_EMPTY_UPPERCASE_STRING_ATOMIC: &TAtomic =
65 &TAtomic::Scalar(TScalar::String(TString::new(None, false, false, true, false, TStringCasing::Uppercase)));
66pub const TRUTHY_STRING_ATOMIC: &TAtomic =
68 &TAtomic::Scalar(TScalar::String(TString::new(None, false, true, false, false, TStringCasing::Unspecified)));
69pub const TRUTHY_LOWERCASE_STRING_ATOMIC: &TAtomic =
71 &TAtomic::Scalar(TScalar::String(TString::new(None, false, true, false, false, TStringCasing::Lowercase)));
72pub const TRUTHY_UPPERCASE_STRING_ATOMIC: &TAtomic =
74 &TAtomic::Scalar(TScalar::String(TString::new(None, false, true, false, false, TStringCasing::Uppercase)));
75pub const CALLABLE_STRING_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::String(TString::callable()));
77pub const LOWERCASE_CALLABLE_STRING_ATOMIC: &TAtomic =
78 &TAtomic::Scalar(TScalar::String(TString::callable_with_casing(TStringCasing::Lowercase)));
79pub const UPPERCASE_CALLABLE_STRING_ATOMIC: &TAtomic =
80 &TAtomic::Scalar(TScalar::String(TString::callable_with_casing(TStringCasing::Uppercase)));
81pub const NUMERIC_STRING_ATOMIC: &TAtomic =
82 &TAtomic::Scalar(TScalar::String(TString::new(None, true, false, false, false, TStringCasing::Unspecified)));
83pub const NUMERIC_TRUTHY_STRING_ATOMIC: &TAtomic =
85 &TAtomic::Scalar(TScalar::String(TString::new(None, true, true, false, false, TStringCasing::Unspecified)));
86pub const CLASS_STRING_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::class_string());
88pub const INTERFACE_STRING_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::interface_string());
90pub const ENUM_STRING_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::enum_string());
92pub const TRAIT_STRING_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::trait_string());
94pub const FLOAT_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::float());
96pub const UNSPECIFIED_LITERAL_FLOAT_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::unspecified_literal_float());
98pub const MIXED_ATOMIC: &TAtomic = &TAtomic::Mixed(TMixed::new());
100pub const ISSET_FROM_LOOP_MIXED_ATOMIC: &TAtomic = &TAtomic::Mixed(TMixed::isset_from_loop());
102pub const NEVER_ATOMIC: &TAtomic = &TAtomic::Never;
104pub const NON_NULL_ATOMIC: &TAtomic = &TAtomic::Mixed(TMixed::non_null());
106pub const FALSY_MIXED_ATOMIC: &TAtomic = &TAtomic::Mixed(TMixed::falsy());
108pub const TRUTHY_MIXED_ATOMIC: &TAtomic = &TAtomic::Mixed(TMixed::truthy());
110pub const RESOURCE_ATOMIC: &TAtomic = &TAtomic::Resource(TResource::new(None));
112pub const OPEN_RESOURCE_ATOMIC: &TAtomic = &TAtomic::Resource(TResource::open());
114pub const CLOSED_RESOURCE_ATOMIC: &TAtomic = &TAtomic::Resource(TResource::closed());
116pub const PLACEHOLDER_ATOMIC: &TAtomic = &TAtomic::Placeholder;
118pub const VOID_ATOMIC: &TAtomic = &TAtomic::Void;
120pub const NULL_ATOMIC: &TAtomic = &TAtomic::Null;
122pub const ARRAYKEY_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::ArrayKey);
124pub const BOOL_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::bool());
126pub const FALSE_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::r#false());
128pub const TRUE_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::r#true());
130pub const OBJECT_ATOMIC: &TAtomic = &TAtomic::Object(TObject::Any);
132pub const NUMERIC_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::Numeric);
134pub static EMPTY_STRING_ATOMIC: LazyLock<TAtomic> = LazyLock::new(|| {
136 TAtomic::Scalar(TScalar::String(TString {
137 literal: Some(TStringLiteral::Value(empty_word())),
138 is_numeric: false,
139 is_truthy: false,
140 is_non_empty: false,
141 is_callable: false,
142 casing: TStringCasing::Unspecified,
143 }))
144});
145pub const UNSPECIFIED_LITERAL_STRING_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::unspecified_literal_string(false));
147pub const NON_EMPTY_UNSPECIFIED_LITERAL_STRING_ATOMIC: &TAtomic =
149 &TAtomic::Scalar(TScalar::unspecified_literal_string(true));
150pub const SCALAR_ATOMIC: &TAtomic = &TAtomic::Scalar(TScalar::Generic);
152
153pub static MIXED_ITERABLE_ATOMIC: LazyLock<TAtomic> = LazyLock::new(|| {
155 TAtomic::Iterable(TIterable {
156 key_type: Arc::new(get_mixed()),
157 value_type: Arc::new(get_mixed()),
158 intersection_types: None,
159 })
160});
161
162pub static EMPTY_KEYED_ARRAY_ATOMIC: LazyLock<TAtomic> =
164 LazyLock::new(|| TAtomic::Array(TArray::Keyed(TKeyedArray::new())));
165pub static MIXED_KEYED_ARRAY_ATOMIC: LazyLock<TAtomic> = LazyLock::new(|| {
167 TAtomic::Array(TArray::Keyed(TKeyedArray::new_with_parameters(Arc::new(get_arraykey()), Arc::new(get_mixed()))))
168});
169pub static MIXED_CALLABLE_ATOMIC: LazyLock<TAtomic> =
171 LazyLock::new(|| TAtomic::Callable(TCallable::Signature(TCallableSignature::mixed(false))));
172pub static MIXED_CLOSURE_ATOMIC: LazyLock<TAtomic> =
174 LazyLock::new(|| TAtomic::Callable(TCallable::Signature(TCallableSignature::mixed(true))));
175
176pub const INT_FLOAT_ATOMIC_SLICE: &[TAtomic] = &[TAtomic::Scalar(TScalar::int()), TAtomic::Scalar(TScalar::float())];
178pub const INT_STRING_ATOMIC_SLICE: &[TAtomic] = &[TAtomic::Scalar(TScalar::int()), TAtomic::Scalar(TScalar::string())];
180pub const NULL_SCALAR_ATOMIC_SLICE: &[TAtomic] = &[TAtomic::Null, TAtomic::Scalar(TScalar::Generic)];
182pub const NULL_STRING_ATOMIC_SLICE: &[TAtomic] = &[TAtomic::Null, TAtomic::Scalar(TScalar::string())];
184pub const NULL_INT_ATOMIC_SLICE: &[TAtomic] = &[TAtomic::Null, TAtomic::Scalar(TScalar::int())];
186pub const NULL_FLOAT_ATOMIC_SLICE: &[TAtomic] = &[TAtomic::Null, TAtomic::Scalar(TScalar::float())];
188pub const NULL_OBJECT_ATOMIC_SLICE: &[TAtomic] = &[TAtomic::Null, TAtomic::Object(TObject::Any)];
190
191pub const SIGNUM_RESULT_SLICE: &[TAtomic] = &[
194 TAtomic::Scalar(TScalar::literal_int(-1)),
195 TAtomic::Scalar(TScalar::literal_int(0)),
196 TAtomic::Scalar(TScalar::literal_int(1)),
197];
198
199pub static EMPTY_SCALAR_ATOMIC_SLICE: LazyLock<[TAtomic; 5]> = LazyLock::new(|| {
200 [
201 TAtomic::Scalar(TScalar::literal_int(0)),
202 TAtomic::Scalar(TScalar::literal_float(0.0)),
203 TAtomic::Scalar(TScalar::literal_string(word("0"))),
204 EMPTY_STRING_ATOMIC.clone(),
205 TAtomic::Scalar(TScalar::r#false()),
206 ]
207});
208
209pub static EMPTY_ATOMIC_SLICE: LazyLock<[TAtomic; 7]> = LazyLock::new(|| {
210 [
211 TAtomic::Null,
212 TAtomic::Scalar(TScalar::literal_int(0)),
213 TAtomic::Scalar(TScalar::literal_float(0.0)),
214 TAtomic::Scalar(TScalar::literal_string(word("0"))),
215 EMPTY_STRING_ATOMIC.clone(),
216 TAtomic::Scalar(TScalar::r#false()),
217 EMPTY_KEYED_ARRAY_ATOMIC.clone(),
218 ]
219});