base-domain
Version:
simple module to help build Domain-Driven Design
288 lines (219 loc) • 5.44 kB
text/coffeescript
'use strict'
Collection = require './collection'
###*
dictionary-structured data model
BaseDict
Collection
base-domain
###
class BaseDict extends Collection
###*
get unique key from item
key
###
: (item) -> item.id
###*
the number of items
{Number} itemLength
###
Object.defineProperty @::, 'itemLength',
get: ->
return 0 if not
Object.keys().length
###*
items: dictionary of keys - models
{Object} items
###
###*
initItems
###
initItems: ->
= {}
###*
check if the model has submodel of the given key or not
has
{String|Number} key
{Boolean}
###
has: (key) ->
return false if not
[key]?
###*
check if the model contains the given submodel or not
contains
{BaseModel} item
{Boolean}
###
contains: (item) ->
return false if not
key = .key item
sameKeyItem =
sameKeyItem?.equals item
###*
turn on/off the value
toggle
{BaseModel} item
###
toggle: (item) ->
if not
return item
key = .key item
if key
item
else
item
###*
turn on/off the value and create a new model
toggle
{BaseModel} item
{BaseDict} newDict
###
$toggle: (item) ->
throw if not
key = .key item
if key
@$remove item
else
@$add item
###*
return submodel of the given key
get
{String|Number} key
{BaseModel}
###
get: (key) ->
return undefined if not
[key]
###*
return submodel of the given key
throw error when not found.
getItem
{String|Number} key
{BaseModel}
###
getItem: (key) ->
throw if not
return [key]
###*
add item to
addItem
{BaseModel} item
###
addItem: (item) ->
key = .key item
[key] = item
###*
remove submodel from items
both acceptable, keys and submodels
remove
{BaseModel|String|Number} item
###
remove: (args...) ->
return if not
ItemClass =
for arg in args
if arg instanceof ItemClass
key = .key(arg)
else
key = arg
item = [key]
delete [key]
if item and
idx = .indexOf(item.id)
.splice(idx, 1) if idx >= 0
return
###*
remove submodel and create a new dict
both acceptable, keys and submodels
$remove
{BaseModel|String|Number} item
{BaseDict} newDict
###
$remove: (args...) ->
throw if not
ItemClass =
newItems =
for arg in args
if arg instanceof ItemClass
key = .key(arg)
else
key = arg
delete newItems[key]
return
###*
replace item and return a new dict
$replace
{BaseModel} item
{BaseDict} newDict
###
$replace: (item) ->
newItems =
key = .key(item)
throw new Error('InvalidItem') if not key?
throw new Error('KeyNotFound') if not
newItems[key] = item
return
###*
replace or add item and return a new dict
$append
{BaseModel} item
{BaseDict} newDict
###
$append: (item) ->
key = .key(item)
throw new Error('InvalidItem') if not key?
if
return @$replace(item)
return @$add(item)
###*
export models to Array
toArray
###
toArray: ->
return [] if not
(item for key, item of )
###*
get all keys
keys
{Array}
###
keys: ->
return [] if not
(key for key, item of )
###*
iterate key - item
keyValues
{Function} fn 1st argument: key, 2nd argument: value
###
keyValues: (fn, _this) ->
_this ?= @
return if typeof fn isnt 'function' or not
fn.call(_this, key, item) for key, item of
return
###*
to key-value object
toObject
###
toObject: ->
obj = {}
for k, v of
obj[k] = v
return obj
module.exports = BaseDict