oveo 0.4.0

Javascript optimizer
Documentation
use oxc_allocator::Address;
use rustc_hash::FxHashMap;

mod hash;

pub use hash::dedupe_hash;

#[derive(Default)]
pub struct DedupeState {
    pub scopes: Vec<FxHashMap<[u8; 20], Address>>,
    pub expressions: FxHashMap<Address, DedupeKind>,
    pub duplicates: u32,
}

pub enum DedupeKind {
    Original(u32),
    Duplicate(Address),
}

impl DedupeState {
    pub fn add(&mut self, address: Address, hash: [u8; 20]) {
        let mut original = true;
        for scope in &mut self.scopes {
            if let Some(original_address) = scope.get(&hash) {
                self.duplicates += 1;
                if let Some(DedupeKind::Original(duplicates_count)) =
                    self.expressions.get_mut(original_address)
                {
                    *duplicates_count += 1;
                }
                self.expressions.insert(address, DedupeKind::Duplicate(*original_address));
                original = false;
                break;
            }
        }
        if original {
            if let Some(scope) = self.scopes.last_mut() {
                scope.insert(hash, address);
                self.expressions.insert(address, DedupeKind::Original(0));
            }
        }
    }
}