| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| Map<Key, dynamic> _cache = <Key, dynamic>{}; |
| const int _maxSize = 10; |
| |
| T cache<T>(Key key, T Function() getter) { |
| T result = _cache[key] as T; |
| if (result != null) { |
| _cache.remove(key); |
| } else { |
| if (_cache.length == _maxSize) |
| _cache.remove(_cache.keys.first); |
| result = getter(); |
| assert(result is! Function); |
| } |
| _cache[key] = result; |
| return result; |
| } |
| |
| abstract class Key { |
| Key(this._value); |
| |
| final dynamic _value; |
| |
| @override |
| bool operator ==(Object other) { |
| if (identical(this, other)) |
| return true; |
| if (runtimeType != other.runtimeType) |
| return false; |
| return other is Key |
| && other._value == _value; |
| } |
| |
| @override |
| int get hashCode => runtimeType.hashCode ^ _value.hashCode; |
| |
| @override |
| String toString() => '$runtimeType($_value)'; |
| } |