use alloc::vec::Vec;
use math::{FieldElement, StarkField};
use crate::{errors::RandomCoinError, ElementHasher, Hasher};
mod default;
pub use default::DefaultRandomCoin;
pub trait RandomCoin: Sync {
type BaseField: StarkField;
type Hasher: ElementHasher<BaseField = Self::BaseField>;
fn new(seed: &[Self::BaseField]) -> Self;
fn reseed(&mut self, data: <Self::Hasher as Hasher>::Digest);
fn check_leading_zeros(&self, value: u64) -> u32;
fn draw<E: FieldElement<BaseField = Self::BaseField>>(&mut self) -> Result<E, RandomCoinError>;
fn draw_integers(
&mut self,
num_values: usize,
domain_size: usize,
nonce: u64,
) -> Result<Vec<usize>, RandomCoinError>;
}