art-standard-lib
Version:
The Standard Library for JavaScript that aught to be.
29 lines (25 loc) • 967 B
text/coffeescript
nextId = 1
# assign runtime-unique Id to objects
module.exports = class Unique
@nextUniqueObjectId: nextUniqueObjectId = -> "object_" + nextId++
@objectId: objectId = (o) ->
if o.hasOwnProperty "__uniqueId"
o.__uniqueId ||= nextUniqueObjectId()
else
Object.defineProperty o, "__uniqueId",
enumerable: false
value: nextUniqueObjectId()
o.__uniqueId
# all possible values for key resolve to a unique Id
@id: (key) ->
if typeof key == "object" || typeof key == "function"
if key
if typeof key.getUniqueId == "function" then key.getUniqueId() else objectId key
else
"null"
else if typeof key == "number" then "" + key
else if typeof key == "symbol" then key.toString()
else if typeof key == "string" then "string_" + key
else if typeof key == "boolean" then (if key then "true" else "false")
else if key == undefined then "undefined"
else "#{typeof key}_#{key}"