algebrite
Version:
Computer Algebra System in Coffeescript
105 lines (86 loc) • 2.32 kB
text/coffeescript
class DoubleLinkedList
constructor: ->
= = null
# removes the last element. Since
# we move used elements to head, the last
# element is *probably* a relatively
# unused one.
remove: (node) ->
if node.pre
node.pre.next = node.next
else
= node.next
if node.next
node.next.pre = node.pre
else
= node.pre
insertBeginning: (node) ->
if
node.next =
.pre = node
= node
else
= = node
moveToHead: (node) ->
node
node
clear: ->
= = null
class LRUCache
constructor: ( = 10, = 60000) ->
= new DoubleLinkedList()
= = 0
resetHitMissCount: ->
= = 0
keys: ->
return Object.keys
values: ->
values = .map (key) =>
key
return values.filter (v) -> v isnt undefined
remove: (key) ->
if [key]?
node = [key]
.remove node
delete [key]
if node.data.onDispose then node.data.onDispose.call this, node.data.key, node.data.value
--
reset: ->
= {}
= 0
.clear()
set: (key, value, onDispose) ->
node = [key]
if node
node.data.value = value
node.data.onDispose = onDispose
node
else
if is then .tailNode.data.key
createNode = (data, pre, next) -> {data, pre, next}
node = createNode {key, value, onDispose}
node.data.lastVisitTime = Date.now()
.insertBeginning node
[key] = node
++
return
get: (key) ->
node = [key]
if !node
++
return undefined
if node
key
++
return undefined
node
++
return node.data.value
_refreshNode: (node) ->
node.data.lastVisitTime = Date.now()
.moveToHead node
_isExpiredNode: (node) ->
return Date.now() - node.data.lastVisitTime >
has: (key) -> return [key]?