use crate::parser::{ast::expr::Expr, fmt::Latex};
use std::fmt;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum RangeKind {
HalfOpen,
Closed,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Range {
pub start: Box<Expr>,
pub end: Box<Expr>,
pub kind: RangeKind,
pub span: std::ops::Range<usize>,
}
impl Range {
pub fn span(&self) -> std::ops::Range<usize> {
self.span.clone()
}
}
impl std::fmt::Display for Range {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self.kind {
RangeKind::HalfOpen => write!(f, "{} .. {}", self.start, self.end),
RangeKind::Closed => write!(f, "{} ..= {}", self.start, self.end),
}
}
}
impl Latex for Range {
fn fmt_latex(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self.kind {
RangeKind::HalfOpen => write!(f, "\\left[{}, {}\\right)", self.start, self.end),
RangeKind::Closed => write!(f, "\\left[{}, {}\\right]", self.start, self.end),
}
}
}