import 'dart:ui' as ui; import 'package:dartterm/wfc/template.dart'; import 'package:dartterm/world/level.dart'; import 'package:flutter/services.dart'; class Assets { final _Table _images = _Table((name) async { final assetImageByteData = await rootBundle.load(name); final codec = await ui.instantiateImageCodec(assetImageByteData.buffer.asUint8List()); final image = (await codec.getNextFrame()).image; return image; }); final _Table> _wfcLevelTemplates = _Table(loadLevelWfcAsync); ui.Image? getImageIfAvailable(String name) { return _images.getIfAvailable(name); } WfcTemplate? getWfcLevelTemplateIfAvailable(String name) { return _wfcLevelTemplates.getIfAvailable(name); } } class _Table { final Map _loaded = {}; final Set _waiting = {}; final Future Function(String) _loadAsync; _Table(this._loadAsync); T? getIfAvailable(String name) { if (!_waiting.contains(name)) { _waiting.add(name); _spawnLoadAsync(name); } return _loaded[name]; } Future _spawnLoadAsync(String name) async { final asset = await _loadAsync(name); _loaded[name] = asset; } } final assets = Assets(); ui.Image? getImageIfAvailable(String name) { return assets.getImageIfAvailable(name); } WfcTemplate? getWfcLevelTemplateIfAvailable(String name) { return assets.getWfcLevelTemplateIfAvailable(name); }