Skip to content
Snippets Groups Projects
Select Git revision
  • 11bf352295cf07498390e35e8b86ab5bec397e3f
  • master default protected
  • rednatco-v2
  • rednatco
  • test
  • ntc-tube-uniform-color
  • ntc-tube-missing-atoms
  • restore-vertex-array-per-program
  • watlas2
  • dnatco_new
  • cleanup-old-nodejs
  • webmmb
  • fix_auth_seq_id
  • update_deps
  • ext_dev
  • ntc_balls
  • nci-2
  • plugin
  • bugfix-0.4.5
  • nci
  • servers
  • v0.5.0-dev.1
  • v0.4.5
  • v0.4.4
  • v0.4.3
  • v0.4.2
  • v0.4.1
  • v0.4.0
  • v0.3.12
  • v0.3.11
  • v0.3.10
  • v0.3.9
  • v0.3.8
  • v0.3.7
  • v0.3.6
  • v0.3.5
  • v0.3.4
  • v0.3.3
  • v0.3.2
  • v0.3.1
  • v0.3.0
41 results

operators.ts

Blame
  • reference-cache.ts 1.78 KiB
    /**
     * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
     *
     * @author Alexander Rose <alexander.rose@weirdbyte.de>
     */
    
    export interface Reference<T> { readonly value: T, usageCount: number }
    
    export function createReference<T>(value: T, usageCount = 0) {
        return { value, usageCount }
    }
    
    export interface ReferenceItem<T> {
        free: () => void
        readonly value: T
    }
    
    export function createReferenceItem<T>(ref: Reference<T>) {
        return {
            free: () => {
                ref.usageCount -= 1
            },
            value: ref.value
        }
    }
    
    export interface ReferenceCache<T, P> {
        get: (props: P) => ReferenceItem<T>
        clear: () => void
        readonly count: number
        dispose: () => void
    }
    
    export function createReferenceCache<T, P, C>(hashFn: (props: P) => string, ctor: (props: P) => T, deleteFn: (v: T) => void): ReferenceCache<T, P> {
        const map: Map<string, Reference<T>> = new Map()
    
        return {
            get: (props: P) => {
                const id = hashFn(props)
                let ref = map.get(id)
                if (!ref) {
                    ref = createReference<T>(ctor(props))
                    map.set(id, ref)
                }
                ref.usageCount += 1
                return createReferenceItem(ref)
            },
            clear: () => {
                map.forEach((ref, id) => {
                    if (ref.usageCount <= 0) {
                        if (ref.usageCount < 0) {
                            console.warn('Reference usageCount below zero.')
                        }
                        deleteFn(ref.value)
                        map.delete(id)
                    }
                })
            },
            get count () {
                return map.size
            },
            dispose: () => {
                map.forEach(ref => deleteFn(ref.value))
                map.clear()
            },
        }
    }