-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathregistry.coffee
78 lines (64 loc) · 1.84 KB
/
registry.coffee
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
###*
# `RegistryProperty` is a hash map collection (holding value of type Object)
###
class RegistryProperty extends (require './property')
constructor: (type, opts, obj) ->
super 'object', opts, obj
@set {} # initialize with empty object to start
match: (query, keys=false) ->
map = @get()
switch
when query instanceof Array
for k, v of map when k in query
if keys then k else v
when query instanceof Object
unless keys then (v for k, v of map).where query
else
results = []
hit = Object.keys(query).length
for key, item of map
match = 0
for k, v of query
match += 1 if item[k] is v
if match is hit
results.push key
results
when query?
unless keys then map[query]
else
if (map.hasOwnProperty query) then query else null
when keys
Object.keys map
else
(v for k, v of map)
merge: (obj) -> @value[k] = v for k, v of obj
remove: (query) ->
keys = @match query, true
switch
when keys instanceof Array
delete @value[key] for key in keys
when keys?
delete @value[keys]
EventEmitter = require('events').EventEmitter
###*
# SynthRegistry
#
# map of key: RegistryProperty
#
# primary methods:
#
# register()
# find()
# update()
# remove()
###
class SynthRegistry extends (require './object')
@set synth: 'registry'
@include EventEmitter
@Property = RegistryProperty
register: (key, property) -> @addProperty key, property
keys: -> super.filter (key) => (@getProperty key) instanceof RegistryProperty
find: (key, query) -> (@getProperty key)?.match query
add: (key, value) -> (@getProperty key)?.merge value
remove: (key, query) -> (@getProperty key)?.remove query
module.exports = SynthRegistry