-
Notifications
You must be signed in to change notification settings - Fork 0
/
permutation-factory.coffee
59 lines (44 loc) · 1.46 KB
/
permutation-factory.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
###
@name permutationFactory
@description
Utility service for generating permutations of a resource.
###
angular.module 'app.permutation'
.factory 'permutationFactory', ->
###
@name permute
@description
Generates permutations from a permutable_attributes object.
@param {Object} permutable_attributes
@param {[Callback]} callback - Optional, invoked for each permutation
@callback callback
@param {Object} permutation
@returns {Array} - Collection of permutations
@example
```coffeescript
permutations = permutationFactory.permute
name: ['Foobar', 'Bizbat']
description: ['I pity the foo.', 'Lorem ipsum.']
```
###
permute: (permutable_attributes, callback) ->
permutations = []
recurse = (keys, payload = {}, position = 0) ->
# We've finished constructing the permutation, exit call stack
if position is keys.length
permutation = _.clone payload
callback? permutation
permutations.push permutation
return
# Grab the current key
key = keys[position]
# There are no values for this attribute, skip it
if permutable_attributes[key].length is 0
recurse keys, payload, position + 1
# Otherwise, recurse for each possible value of this attribute
else
for value in permutable_attributes[key]
payload[key] = value
recurse keys, payload, position + 1
recurse Object.keys permutable_attributes
return permutations