import 'dart:collection'; typedef EvictionHandler(K key, V value); class LRUMap { final LinkedHashMap _map = new LinkedHashMap(); final int _maxSize; final EvictionHandler _handler; LRUMap(this._maxSize, [this._handler]); V get(K key) { V value = _map.remove(key); if (value != null) { _map[key] = value; } return value; } void put(K key, V value) { _map.remove(key); _map[key] = value; if (_map.length > _maxSize) { K evictedKey = _map.keys.first; V evictedValue = _map.remove(evictedKey); if (_handler != null) { _handler(evictedKey, evictedValue); } } } void remove(K key) { _map.remove(key); } }