Code coverage report for src/singletonify.js

Statements: 100% (31 / 31)      Branches: 100% (12 / 12)      Functions: 100% (7 / 7)      Lines: 100% (28 / 28)      Ignored: none     

All files » src/ » singletonify.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50    13   13   78   78   58 58 58   1 18 15   16 16     58 68 48   66 66     58 25 25 14 14       58 10 4 4       58 103      
'use strict'
 
import {ACQUIRE, RELEASE, DISPOSE} from './signals'
 
export default function singletonify(create, LAZY) {
 
	LAZY = LAZY || false
 
	return function (value, resolveDeps, releaseDeps) {
 
		var handlers = {}
		var count = 0
		var instance
 
		function dispose() {
			if (typeof instance.dispose === 'function') {
				instance.dispose()
			}
			instance = undefined
			count = 0
		}
 
		handlers[ACQUIRE] = function (value) {
			if (typeof instance === 'undefined') {
				instance = create.call(this, value, resolveDeps())
			}
			count++
			return instance
		}
 
		handlers[RELEASE] = function (value) {
			count--
			if (count == 0 && !LAZY) {
				releaseDeps()
				dispose()
			}
		}
 
		handlers[DISPOSE] = function (value) {
			if (instance) {
				releaseDeps()
				dispose()
			}
		}
 
		return function (signal) {
			return handlers[signal].call(this, value)
		}
	}
}