mercur 0.1.3

mercur - junolang package manager
use bloomfilter::Bloom;

use crate::registry::{
    compile::{hash::package_id, model::RegistryModel, parse::PkgDefinition as PkgTomlDefinition},
    schema::registry::BloomHeader,
};

/// Number of hash functions.
pub const HASH_FUNCTIONS: u8 = 7;

/// False positive rate.
const FALSE_POSITIVE_RATE: f64 = 0.01;

/// Creates a bloom filter over all package IDs.
///
/// Used to instantly skip registries that definitely
/// do not contain a package.
pub fn build_bloom(pkgs: &[&PkgTomlDefinition]) -> Bloom<u64> {
    let mut bloom = Bloom::new_for_fp_rate(pkgs.len(), 0.01).expect("invalid bloom");

    for pkg in pkgs {
        bloom.set(&package_id(&pkg.metadata.name));
    }

    bloom
}
use flatbuffers::{FlatBufferBuilder, WIPOffset};

use crate::registry::schema::registry::{BloomFilter, BloomFilterArgs};

pub fn compile_bloom<'a>(
    builder: &mut FlatBufferBuilder<'a>,
    bloom: Bloom<u64>,
) -> WIPOffset<BloomFilter<'a>> {
    //
    // Raw bitmap.
    //
    let bits = builder.create_vector(bloom.as_slice());

    let header = BloomHeader::new(HASH_FUNCTIONS, 0, 0);

    BloomFilter::create(
        builder,
        &BloomFilterArgs {
            header: Some(&header),
            bits: Some(bits),
        },
    )
}