geam-stdlib 0.2.0

Official Gleam standard-library providers for Geam
Documentation
use crate::BitArrayValue;
use geam_core::provider_support::bit_array_byte_slice;
use num_bigint::{BigInt, Sign};
use num_traits::ToPrimitive;

pub(in crate::bit_array) fn slice(
    value: BitArrayValue,
    position: BigInt,
    length: BigInt,
) -> Result<BitArrayValue, ()> {
    let endpoint = &position + &length;
    let (start, end) = if position <= endpoint {
        (position, endpoint)
    } else {
        (endpoint, position)
    };
    let byte_len = BigInt::from(value.bit_len() / 8);
    let selected =
        if value.bit_len().is_multiple_of(8) && start.sign() != Sign::Minus && end <= byte_len {
            start
                .to_usize()
                .zip((&end - &start).to_usize())
                .and_then(|(start, length)| bit_array_byte_slice(&value, start, length))
        } else {
            None
        };

    selected.ok_or(())
}