Skip to content
Snippets Groups Projects
Select Git revision
  • be94e0fe09936b76c3000a3def87eaac0bd13bf6
  • master default protected
  • devel
  • hruska-feature-clients-api
  • malostik-#5066-deduplicate-idea-ids
  • warden-postgresql-port
  • hruska-feature-#6799-filter-keys
  • hruska-feature-5066-duplicateIdeaID
  • warden-client-3.0-beta3
  • warden-server-3.0-beta3
  • warden-client-2.2-final
  • warden-server-2.2-final
  • warden-client-3.0-beta2
  • warden-server-3.0-beta2
  • warden-client-2.2
  • warden-server-2.2-patch3
  • warden-client-3.0-beta1
  • warden-server-3.0-beta1
  • warden-server-2.2-patch1
  • warden-client-3.0-beta0
  • warden-server-3.0-beta0
  • warden-server-2.2
  • warden-server-2.1-patch1
  • warden-client-2.1
  • warden-server-2.1
  • warden-server-2.1-beta6
  • warden-server-2.1-beta5
  • warden-server-2.1-beta4
28 results

WardenReg.pm

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()
            },
        }
    }