Conflicts: CHANGELOG.md Gruntfile.coffee css/burichan.css css/futaba.css css/photon.css css/style.css css/tomorrow.css css/yotsuba-b.css css/yotsuba.css html/General/Index-navlinks.html html/General/Settings-section-Rice.html html/General/Settings.html html/Posting/QR.html json/archives.json package.json src/Filtering/PostHiding.coffee src/Filtering/Recursive.coffee src/Filtering/ThreadHiding.coffee src/General/Build.coffee src/General/Config.coffee src/General/Get.coffee src/General/Header.coffee src/General/Index.coffee src/General/Main.coffee src/General/Settings.coffee src/General/UI.coffee src/General/lib/$.coffee src/General/lib/databoard.class src/General/lib/post.class src/General/lib/thread.class src/Images/ImageExpand.coffee src/Images/RevealSpoilers.coffee src/Linkification/Linkify.coffee src/Menu/Menu.coffee src/Miscellaneous/ExpandThread.coffee src/Miscellaneous/IDColor.coffee src/Miscellaneous/Keybinds.coffee src/Monitoring/ThreadUpdater.coffee src/Monitoring/Unread.coffee src/Posting/QR.captcha.coffee src/Posting/QR.coffee src/Posting/QR.cooldown.coffee src/Quotelinks/QuoteBacklink.coffee src/Quotelinks/QuoteCT.coffee src/Quotelinks/QuoteOP.coffee src/Quotelinks/QuoteStrikeThrough.coffee src/Quotelinks/QuoteYou.coffee src/Quotelinks/Quotify.coffee
80 lines
1.3 KiB
Plaintext
80 lines
1.3 KiB
Plaintext
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
|
|
|
|
@rmi item
|
|
|
|
{prev} = root
|
|
root.prev = item
|
|
item.next = root
|
|
item.prev = prev
|
|
prev.next = item if prev
|
|
|
|
after: (root, item) ->
|
|
return if item.prev is root
|
|
|
|
@rmi item
|
|
|
|
{next} = root
|
|
root.next = item
|
|
item.prev = root
|
|
item.next = next
|
|
next.prev = item if next
|
|
|
|
prepend: (item) ->
|
|
{first} = @
|
|
return if item is first or not @[item.ID]
|
|
@rmi item
|
|
item.next = first
|
|
first.prev = 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 |