use super::CircleDomain;
use crate::core::circle::{CirclePoint, CirclePointIndex, Coset};
use crate::core::fields::m31::BaseField;
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct CanonicCoset {
pub coset: Coset,
}
impl CanonicCoset {
pub fn new(log_size: u32) -> Self {
assert!(log_size > 0);
Self {
coset: Coset::odds(log_size),
}
}
pub const fn coset(&self) -> Coset {
self.coset
}
pub fn half_coset(&self) -> Coset {
Coset::half_odds(self.log_size() - 1)
}
pub fn circle_domain(&self) -> CircleDomain {
CircleDomain::new(self.half_coset())
}
pub const fn log_size(&self) -> u32 {
self.coset.log_size
}
pub const fn size(&self) -> usize {
self.coset.size()
}
pub const fn initial_index(&self) -> CirclePointIndex {
self.coset.initial_index
}
pub const fn step_size(&self) -> CirclePointIndex {
self.coset.step_size
}
pub const fn step(&self) -> CirclePoint<BaseField> {
self.coset.step
}
pub fn index_at(&self, index: usize) -> CirclePointIndex {
self.coset.index_at(index)
}
pub fn at(&self, i: usize) -> CirclePoint<BaseField> {
self.coset.at(i)
}
}