impl ArcisRNG {
    pub fn gen_uniform<T: ArcisType>() -> T {
        #[arcis_circuit = "n_bools"]
        pub fn n_bools<T: ArcisType>() -> usize {}
        #[arcis_circuit = "from_bools"]
        pub fn from_bools<T: ArcisType>(arg: &[bool]) -> T {}

        let len = n_bools::<T>();

        let mut bools = [false; len];

        for i in 0..len {
            bools[i] = ArcisRNG::bool();
        }

        from_bools::<T>(&bools)
    }
    #[arcis_circuit = "ArcisRNG::shuffle"]
    pub fn shuffle<T>(a: &mut [T]) {}
    #[arcis_circuit = "ArcisRNG::bool"]
    pub fn bool() -> bool {}
    #[arcis_circuit = "ArcisRNG::gen_integer_from_width"]
    pub fn gen_integer_from_width(width: usize) -> u128 {}
    #[arcis_circuit = "ArcisRNG::gen_public_integer_from_width"]
    pub fn gen_public_integer_from_width(width: usize) -> u128 {}
}

impl<T: ArcisType> T {
    #[arcis_circuit = "n_arcis_values"]
    pub fn n_values() -> usize {}
    #[arcis_circuit = "n_packed_arcis_values"]
    pub fn n_packed_values() -> usize {}
}

impl ArcisX25519Pubkey {
    #[arcis_circuit = "x25519_pubkey_from_x"]
    pub fn new_from_x(x: BaseField) -> Self {}

    #[arcis_circuit = "x25519_pubkey_to_x"]
    pub fn to_x(self) -> BaseField {}
}
