needier

0.5.1 • Public • Published

needier

Build Status Dependency Status npm version

Dependency ordering with depth first search.

Install

npm install needier --save

Usage

needs = require('needier')()           # one-step: require and call function 
 
needs.add id:'A'needs:[ 'B''C' ]   # A needs both B and C. B+C added as strings 
 
needs.add id:'B'needs:['D']          # B needs D. Replaces string B with object 
 
needs.add id:'C'needs:['E']          # C needs E. Replaces string C with object 
 
result = needs.add id:'D'needs:['C'# D needs C. Replaces string D with object 
# result.added = [ {id:'D', needs:['C']} ] 
 
# all functions can accept IDs as strings or as an 'id' property on an object 
# all functions can accept multiple arguments, or an array of arguments 
result = needs.has 'B''E'
result = needs.has ['B''E']          # same as line above 
result = needs.has {id:'B'}{id:'E'}  # same as well 
#result.has = { B:true, E:true } 
 
result = needs.of 'A'               # get list of needs for 'A' 
#result.needsOf = A:['B', 'C' ] 
 
result = needs.'B'                # list what needs 'B' 
#result.needsA = B:['A'] 
 
console.log needs.ordered().array   # order the needs and get array from results 
# prints: [ 'E', 'C', 'D', 'B', 'A' ] 
 
# full ordered() results are: 
# { success:true, had:'needs', array: [seen above] } 
 
result = needs.remove 'C'
#result.removed = [ {id:'C', needs:['E']} ] 

API of Needs

needs.add(object+)

need1 = 'someStringId'  # a string, will be both id and object 
need2 = id:'ObjectId1'  # an object with `id` property 
need3 = id:'ObjectId2'needs:[ 'anotherStringId' # object with id and needs 
 
results = needs.add need1need2need3
results = # contents are: 
  success:true
  added:
    someStringId:'someStringId'  # string 
    ObjectID1: { id:'ObjectID1'} # full object 
    ObjectID2: { id:'ObjectID2'needs:['anotherStringId']} props
    anotherStringId: 'anotherStringId' # implicitly added by ObjectID2 

needs.include(id, needs+)

Add needs (dependencies) to an existing need.

 
needs.add id:'A'needs:['B']
 
# three equivalent calls 
#  id can be a string or an object with an id property 
#  needs can be a list of arguments or an array 
needs.include 'A''C'
needs.include {id:'A'}'C'
needs.include 'A'['C']
 
result = needs.of 'A'
results = # contents are: 
  success:true
  needsOf: A:['B''C']

needs.has(id+)

Check existence of need(s) with the specified ids.

# assume it has needs A and B 
result = needs.has 'A''B''C'
needs.has {id:'A'}{id:'B'}{id:'C'} # same as above 
needs.has ['A''B''C'# same as above 
 
result = # results of above calls: 
  success:true
  has:
    A:true
    B:true
    C:false
 
# access results like: 
if result.has.then 'good'

needs.remove(id+)

Remove needs (dependencies). An id can be a string or an object with an id property.

needs.add 'A'{id:'B'}{id:'C'needs:['D']}
# now contains A,B,C,D 
 
result = needs.remove 'A'  
needs.remove id:'A'   # same 
needs.remove {id:'A'} # same 
# now contains B,C,D 
result = # contents are: 
  success:true
  removed:
    A:'A'
 
result = needs.remove 'C'
# now contains B,D. 
# NOTE: D remains, added implicitly, remove explicitly. TODO: fix this 
result = # contents are: 
  success:true
  removed:
    C:{id:'C'needs:['D']}
 
result = needs.remove 'B''D'
needs.remove ['B''D']  #all alternates allowed 
# now empty 
result = # contents are: 
  success:true
  removed:
    B:{id:'B'}
    D:'D'

needs.retract(id, needs+)

Removes needs (dependencies) from an existing need.

 
needs.add id:'A'needs:['B''C']
 
# three equivalent calls 
#  id can be a string or an object with an id property 
#  needs can be a list of arguments or an array 
needs.retract 'A''C'
needs.retract 'A'['C']
needs.retract {id:'A'}['C']
 
result = needs.of 'A'
results = # contents are: 
  success:true
  needsOf: A:['B']

needs.replace(id, needs+)

Replaces existing needs (dependencies) of an existing need.

 
needs.add id:'A'needs:['B''C']
 
# three equivalent calls 
#  id can be a string or an object with an id property 
#  needs can be a list of arguments or an array 
needs.replace 'A''D''E'
needs.replace {id:'A'}'D''E'
needs.replace 'A'['D''E']
 
result = needs.of 'A'
results = # contents are: 
  success:true
  needsOf: A:['D''E']

needs.of(id+)

Gather needs (dependencies) for all specified id's. An id can be a string or an object with an id property.

# all four lines are equivalent 
needs.of 'A''B'
needs.of ['A''B']
needs.of {id:'A'}{id:'B'}
needs.of [ {id:'A'}{id:'B'} ]
 
result = # result of all the above calls are the same: 
  success:true
  needsOf: # we didn't add any needs (deps), so the arrays are empty 
    A: []
    B: []

needs.a(id+)

Gather needs which need (depend on) the specified ids.

needs.add {id:'A'needs:['C']}{id:'B'needs:['C']}
result = needs.'C'
result = # contents are: 
  success:true
  needsA: # maps specified need IDs to the objects which needed them 
    'C': [{id:'A'needs:['C']}{id:'B'needs:['C']}]

needs.ordered()

Provides all known needs ordered into an array.

Note: This function is the primary reason for this library.

needs.add {id:'C'needs:['B']}  # can all be passed to add() at once, too 
needs.add {id:'D'needs:['C']}
needs.add {id:'B'needs:['A']}
result = needs.ordered()
result = # contents are: 
  success:true
  ordered: [ # basically: A, B, C, D. A is a string, added implicityly by B. 
    'A'{id:'B'needs:['A']}{id:'C'needs:['B']}{id:'D'needs:['C']}
  ]

Todo

  1. add tests for get
  2. add before/after constraints instead of needs (which is essentially an after constraint)
  3. add tests for before/after
  4. add tests for include/retract/replace

MIT License

Package Sidebar

Install

npm i needier

Weekly Downloads

3

Version

0.5.1

License

MIT

Last publish

Collaborators

  • elidoran