use crate::lib::{json, Value};
use crate::{to_safe_integer_x};
pub fn x_range_x(start: isize, end: isize, step: isize) -> Vec<isize> {
let mut result = vec![];
match step {
step if step > 0 => {
if start >= end {
return result;
}
let mut cur = start;
loop {
result.push(cur);
cur += step;
if cur >= end {
break;
}
}
}
step if step < 0 => {
if start <= end {
return result;
}
let mut cur = start;
loop {
result.push(cur);
cur += step;
if cur <= end {
break;
}
}
}
_ => {
if start >= end {
return result;
} else {
return vec![start; (end - start) as usize];
}
}
}
result
}
pub fn x_range(start: isize, end: isize, step: isize) -> Value {
Value::Array(
x_range_x(start, end, step)
.iter()
.map(|n| json!(n))
.collect::<Vec<Value>>(),
)
}
pub fn range_x(start: Value, end: Value, step: isize) -> Vec<isize> {
x_range_x(to_safe_integer_x(start), to_safe_integer_x(end), step)
}
pub fn range(start: Value, end: Value, step: isize) -> Value {
x_range(to_safe_integer_x(start), to_safe_integer_x(end), step)
}
#[macro_export]
macro_rules! x_range_x {
() => {{
let a: Vec<isize> = vec![];
a
}};
($a:expr $(,)*) => {{
if $a >= 0 {
$crate::x_range_x(0, $a, 1)
} else {
$crate::x_range_x(0, $a, -1)
}
}};
($a:expr, $b:expr $(,)*) => {
$crate::x_range_x($a, $b, 1)
};
($a:expr, $b:expr, $c:expr $(,)*) => {
$crate::x_range_x($a, $b, $c)
};
($a:expr, $b:expr, $c:expr, $($rest:tt)*) => {
$crate::x_range_x($a, $b, $c)
};
}
#[macro_export]
macro_rules! x_range {
() => {
json!([])
};
($a:expr $(,)*) => {{
if $a >= 0 {
$crate::x_range(0, $a, 1)
} else {
$crate::x_range(0, $a, -1)
}
}};
($a:expr, $b:expr $(,)*) => {
$crate::x_range($a, $b, 1)
};
($a:expr, $b:expr, $c:expr $(,)*) => {
$crate::x_range($a, $b, $c)
};
($a:expr, $b:expr, $c:expr, $($rest:tt)*) => {
$crate::x_range($a, $b, $c)
};
}
#[macro_export]
macro_rules! range_x {
() => {{
let a: Vec<isize> = vec![];
a
}};
($a:expr $(,)*) => {{
let end = $crate::to_safe_integer_x($a);
if end >= 0 {
$crate::x_range_x(0, end, 1)
} else {
$crate::x_range_x(0, end, -1)
}
}};
($a:expr, $b:expr $(,)*) => {
$crate::range_x($a, $b, 1)
};
($a:expr, $b:expr, $c:expr $(,)*) => {
$crate::range_x($a, $b, $c)
};
($a:expr, $b:expr, $c:expr, $($rest:tt)*) => {
$crate::range_x($a, $b, $c)
};
}
#[macro_export]
macro_rules! range {
() => {
json!([])
};
($a:expr $(,)*) => {{
let end = $crate::to_safe_integer_x($a);
if end >= 0 {
$crate::x_range(0, end, 1)
} else {
$crate::x_range(0, end, -1)
}
}};
($a:expr, $b:expr $(,)*) => {
$crate::range($a, $b, 1)
};
($a:expr, $b:expr, $c:expr $(,)*) => {
$crate::range($a, $b, $c)
};
($a:expr, $b:expr, $c:expr, $($rest:tt)*) => {
$crate::range($a, $b, $c)
};
}