use std::{fmt, ops::Range};
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq, Ord, PartialOrd, Eq)]
pub struct TimeIndexEntry(pub i64, pub usize);
pub trait AsTime: fmt::Debug + Copy + Ord + Eq + Send + Sync + 'static {
fn t(&self) -> i64;
fn dt(&self) -> Option<DateTime<Utc>> {
let t = self.t();
DateTime::from_timestamp_millis(t)
}
fn range(w: Range<i64>) -> Range<Self>;
fn i(&self) -> usize {
0
}
fn new(t: i64, s: usize) -> Self;
}
impl From<i64> for TimeIndexEntry {
fn from(value: i64) -> Self {
Self::start(value)
}
}
impl TimeIndexEntry {
pub const MIN: TimeIndexEntry = TimeIndexEntry(i64::MIN, 0);
pub const MAX: TimeIndexEntry = TimeIndexEntry(i64::MAX, usize::MAX);
pub fn new(t: i64, s: usize) -> Self {
Self(t, s)
}
pub fn start(t: i64) -> Self {
Self(t, 0)
}
pub fn end(t: i64) -> Self {
Self(t.saturating_add(1), 0)
}
}
impl AsTime for i64 {
fn t(&self) -> i64 {
*self
}
fn range(w: Range<i64>) -> Range<Self> {
w
}
fn new(t: i64, _s: usize) -> Self {
t
}
}
impl AsTime for TimeIndexEntry {
fn t(&self) -> i64 {
self.0
}
fn range(w: Range<i64>) -> Range<Self> {
Self::start(w.start)..Self::start(w.end)
}
fn i(&self) -> usize {
self.1
}
fn new(t: i64, s: usize) -> Self {
Self(t, s)
}
}