Line data Source code
1 : import 'dart:async'; 2 : 3 : import 'dart:collection'; 4 : 5 : import 'package:meta/meta.dart'; 6 : import 'package:widgetbook/src/models/model.dart'; 7 : import 'package:widgetbook/src/repositories/repository.dart'; 8 : 9 : class MemoryRepository<Item extends Model> extends Repository<Item> { 10 : @internal 11 : final Map<String, Item> memory; 12 : 13 : final StreamController<List<Item>> _streamController; 14 : 15 1 : MemoryRepository({Map<String, Item>? initialConfiguration}) 16 1 : : memory = initialConfiguration ?? HashMap(), 17 1 : _streamController = StreamController<List<Item>>.broadcast() { 18 3 : _streamController.onListen = _emitChangesToStream; 19 : } 20 : 21 1 : void _emitChangesToStream() { 22 5 : _streamController.add(memory.values.toList()); 23 : } 24 : 25 1 : String _addItemAndEmitChangesToStream(Item item) { 26 1 : String id = _addItem(item); 27 1 : _emitChangesToStream(); 28 : return id; 29 : } 30 : 31 1 : String _addItem(Item item) { 32 4 : memory.putIfAbsent(item.id, () => item); 33 1 : return item.id; 34 : } 35 : 36 1 : @override 37 : String addItem(Item item) { 38 1 : return _addItemAndEmitChangesToStream(item); 39 : } 40 : 41 1 : void deleteItemAndEmitChangesToStream(Item item) { 42 1 : _deleteItem(item); 43 1 : _emitChangesToStream(); 44 : } 45 : 46 1 : void _deleteItem(Item item) { 47 3 : memory.remove(item.id); 48 : } 49 : 50 1 : @override 51 : void deleteItem(Item item) { 52 1 : deleteItemAndEmitChangesToStream(item); 53 : } 54 : 55 1 : @override 56 : Stream<List<Item>> getStreamOfItems() { 57 2 : return _streamController.stream; 58 : } 59 : 60 1 : @override 61 : void setItem(Item item) { 62 3 : if (!memory.containsKey(item.id)) { 63 1 : _addItemAndEmitChangesToStream(item); 64 : } else { 65 1 : updateItem(item); 66 : } 67 : } 68 : 69 1 : @override 70 : void updateItem(Item item) { 71 3 : memory[item.id] = item; 72 1 : _emitChangesToStream(); 73 : } 74 : 75 1 : @override 76 : bool doesItemExist(String id) { 77 2 : return memory.containsKey(id); 78 : } 79 : 80 1 : @override 81 : Item getItem(String id) { 82 2 : return memory[id]!; 83 : } 84 : 85 1 : @override 86 : void deleteAll() { 87 2 : memory.clear(); 88 1 : _emitChangesToStream(); 89 : } 90 : 91 1 : @override 92 : void addAll(Iterable<Item> items) { 93 1 : var map = HashMap<String, Item>.fromIterable( 94 : items, 95 2 : key: (k) => k.id, 96 1 : value: (v) => v, 97 : ); 98 2 : memory.addAll(map); 99 1 : _emitChangesToStream(); 100 : } 101 : 102 1 : @override 103 : Future<void> closeStream() { 104 2 : return _streamController.close(); 105 : } 106 : }