Skip to content

Instantly share code, notes, and snippets.

@PlugFox
Last active September 18, 2019 08:09
Show Gist options
  • Save PlugFox/bb2cf58f199886cc0971d75a3e337b6a to your computer and use it in GitHub Desktop.
Save PlugFox/bb2cf58f199886cc0971d75a3e337b6a to your computer and use it in GitHub Desktop.
Repository realisation in dart
/*
Repository realisation in dart
https://gist.github.com/PlugFox/bb2cf58f199886cc0971d75a3e337b6a
https://dartpad.dartlang.org/bb2cf58f199886cc0971d75a3e337b6a
*/
import 'dart:async';
// Repository controller
abstract class Repository {
static final RepositoryProvider _repository = RepositoryProvider();
static Future<Set<User>> fetchUsers() async =>
await Future.wait([
_repository.facebookProvider.fetchUsers(count: 15, offset: 100),
_repository.vkontakteProvider.fetchUsers(count: 13, offset: -100),
]).then(
(List<Set<User>> list) => list.fold<Set<User>>(<User>{}, (Set<User> a, Set<User> b) => a..addAll(b))
).then(
(Set<User> users) => _repository.localProvider.storeUsers(users).then((_) => users)
);
factory Repository._() => null;
}
// Repository provider
class RepositoryProvider {
final FacebookProvider facebookProvider = FacebookProvider();
final VkontakteProvider vkontakteProvider = VkontakteProvider();
final LocalProvider localProvider = LocalProvider();
// SINGLETON +
static final RepositoryProvider _repository = RepositoryProvider._internal();
factory RepositoryProvider() => _repository;
RepositoryProvider._internal() {
print('Creating singleton RepositoryProvider');
}
// SINGLETON -
}
// PROVIDERS
class FacebookProvider {
static const String _origin = 'Facebook';
Future<Set<User>> fetchUsers({int count = 1, int offset = 0,}) async =>
await List<User>.generate(count, (int id) => User(id + offset, socialNetwork: FacebookProvider._origin)).toSet();
}
class VkontakteProvider {
static const String _origin = 'Vkontakte';
Future<Set<User>> fetchUsers({int count = 1, int offset = 0,}) async =>
await List<User>.generate(count, (int id) => User(id + offset, socialNetwork: VkontakteProvider._origin)).toSet();
}
class LocalProvider {
final Set<User> _users = <User>{};
Future<void> storeUsers(Iterable<User> users) async => await this._users.addAll(users);
}
// Model
class User {
final int _id;
final String _origin;
User(int id, {String socialNetwork = 'Unknown'})
: assert(id is int && id != 0)
, this._id = id
, this._origin = socialNetwork;
@override
String toString() => '<${this._origin} user №${_id.toRadixString(16)}>';
@override
int get hashCode => this._id;
@override
bool operator ==(Object user) => user is User && this.hashCode == user.hashCode;
}
void main() async {
print(await Repository.fetchUsers());
} // main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment