90 lines
1.5 KiB
CoffeeScript
90 lines
1.5 KiB
CoffeeScript
class RandomAccessList
|
|
constructor: (items) ->
|
|
@length = 0
|
|
@push item for item in items if items
|
|
|
|
push: (data) ->
|
|
{ID} = data
|
|
ID or= data.id
|
|
return if @[ID]
|
|
{last} = @
|
|
@[ID] = item =
|
|
prev: last
|
|
next: null
|
|
data: data
|
|
ID: ID
|
|
item.prev = last
|
|
@last = if last
|
|
last.next = item
|
|
else
|
|
@first = item
|
|
@length++
|
|
|
|
before: (root, item) ->
|
|
return if item.next is root or item is root
|
|
|
|
@rmi item
|
|
|
|
{prev} = root
|
|
root.prev = item
|
|
item.next = root
|
|
item.prev = prev
|
|
if prev
|
|
prev.next = item
|
|
else
|
|
@first = item
|
|
|
|
after: (root, item) ->
|
|
return if item.prev is root or item is root
|
|
|
|
@rmi item
|
|
|
|
{next} = root
|
|
root.next = item
|
|
item.prev = root
|
|
item.next = next
|
|
if next
|
|
next.prev = item
|
|
else
|
|
@last = item
|
|
|
|
prepend: (item) ->
|
|
{first} = @
|
|
return if item is first or not @[item.ID]
|
|
@rmi item
|
|
item.next = first
|
|
if first
|
|
first.prev = item
|
|
else
|
|
@last = item
|
|
@first = item
|
|
delete item.prev
|
|
|
|
shift: ->
|
|
@rm @first.ID
|
|
|
|
order: ->
|
|
order = [item = @first]
|
|
order.push item while item = item.next
|
|
order
|
|
|
|
rm: (ID) ->
|
|
item = @[ID]
|
|
return unless item
|
|
delete @[ID]
|
|
@length--
|
|
@rmi item
|
|
delete item.next
|
|
delete item.prev
|
|
|
|
rmi: (item) ->
|
|
{prev, next} = item
|
|
if prev
|
|
prev.next = next
|
|
else
|
|
@first = next
|
|
if next
|
|
next.prev = prev
|
|
else
|
|
@last = prev
|