use crate::lib::{json, Value};
use crate::{to_safe_integer_x, x_range_x};
pub fn x_range_right_x(start: isize, end: isize, step: isize) -> Vec<isize> {
let mut vec = x_range_x(start, end, step);
vec.reverse();
vec
}
pub fn x_range_right(start: isize, end: isize, step: isize) -> Value {
Value::Array(
x_range_right_x(start, end, step)
.iter()
.map(|n| json!(n))
.collect::<Vec<Value>>(),
)
}
pub fn range_right_x(start: Value, end: Value, step: isize) -> Vec<isize> {
x_range_right_x(to_safe_integer_x(start), to_safe_integer_x(end), step)
}
pub fn range_right(start: Value, end: Value, step: isize) -> Value {
x_range_right(to_safe_integer_x(start), to_safe_integer_x(end), step)
}
#[macro_export]
macro_rules! x_range_right_x {
() => {{
let a: Vec<isize> = vec![];
a
}};
($a:expr $(,)*) => {{
if $a >= 0 {
$crate::x_range_right_x(0, $a, 1)
} else {
$crate::x_range_right_x(0, $a, -1)
}
}};
($a:expr, $b:expr $(,)*) => {
$crate::x_range_right_x($a, $b, 1)
};
($a:expr, $b:expr, $c:expr $(,)*) => {
$crate::x_range_right_x($a, $b, $c)
};
($a:expr, $b:expr, $c:expr, $($rest:tt)*) => {
$crate::x_range_right_x($a, $b, $c)
};
}
#[macro_export]
macro_rules! x_range_right {
() => {
json!([])
};
($a:expr $(,)*) => {{
if $a >= 0 {
$crate::x_range_right(0, $a, 1)
} else {
$crate::x_range_right(0, $a, -1)
}
}};
($a:expr, $b:expr $(,)*) => {
$crate::x_range_right($a, $b, 1)
};
($a:expr, $b:expr, $c:expr $(,)*) => {
$crate::x_range_right($a, $b, $c)
};
($a:expr, $b:expr, $c:expr, $($rest:tt)*) => {
$crate::x_range_right($a, $b, $c)
};
}
#[macro_export]
macro_rules! range_right_x {
() => {{
let a: Vec<isize> = vec![];
a
}};
($a:expr $(,)*) => {{
let end = $crate::to_safe_integer_x($a);
if end >= 0 {
$crate::x_range_right_x(0, end, 1)
} else {
$crate::x_range_right_x(0, end, -1)
}
}};
($a:expr, $b:expr $(,)*) => {
$crate::range_right_x($a, $b, 1)
};
($a:expr, $b:expr, $c:expr $(,)*) => {
$crate::range_right_x($a, $b, $c)
};
($a:expr, $b:expr, $c:expr, $($rest:tt)*) => {
$crate::range_right_x($a, $b, $c)
};
}
#[macro_export]
macro_rules! range_right {
() => {
json!([])
};
($a:expr $(,)*) => {{
let end = $crate::to_safe_integer_x($a);
if end >= 0 {
$crate::x_range_right(0, end, 1)
} else {
$crate::x_range_right(0, end, -1)
}
}};
($a:expr, $b:expr $(,)*) => {
$crate::range_right($a, $b, 1)
};
($a:expr, $b:expr, $c:expr $(,)*) => {
$crate::range_right($a, $b, $c)
};
($a:expr, $b:expr, $c:expr, $($rest:tt)*) => {
$crate::range_right($a, $b, $c)
};
}