Skip to content

Instantly share code, notes, and snippets.

@zoytsa
Forked from PlugFox/main.dart
Created August 14, 2021 14:12
Show Gist options
  • Select an option

  • Save zoytsa/1f9891c1348fa2011c906f29d1ae2439 to your computer and use it in GitHub Desktop.

Select an option

Save zoytsa/1f9891c1348fa2011c906f29d1ae2439 to your computer and use it in GitHub Desktop.
Get Super Provider XXL GetSuperProviderXXL
/*
* GET SUPER PROVIDER XXL
* From GetX Architects and for GetX Architects
* with L<3VE
*
* https://gist.github.com/PlugFox/fa6ff53257c7bd8edb11ebc2fe889d8e
* https://dartpad.dev/fa6ff53257c7bd8edb11ebc2fe889d8e
*/
/// SUPER LIBRARY:
library get_super_provider_xxl;
import 'dart:async';
import 'dart:collection' show MapMixin;
final IGetSuperProviderXXL getXXL = GetSuperProviderXXL.I;
final IGetSuperProviderXXL x = GetSuperProviderXXL.I;
typedef IGetSuperProviderXXLKey = Object?;
typedef IGetSuperProviderXXLValue = Object?;
extension GetSuperProviderXXLExtension on Object? {
IGetSuperProviderXXL get getXXL => GetSuperProviderXXL.I;
IGetSuperProviderXXL get x => GetSuperProviderXXL.I;
}
abstract class IGetSuperProviderXXL
implements Map<IGetSuperProviderXXLKey, IGetSuperProviderXXLValue> {
/// Stream with inserted values
Stream<IGetSuperProviderXXLValue> get stream;
/// Get and cast value if exist
T? getAs<T extends IGetSuperProviderXXLValue>(IGetSuperProviderXXLKey key);
}
/// Safer than Riverpod
/// State managment as Cubit & Provider
/// Service locator as GetIt
/// Faster then GetX (tested on M1)
/// Compile & Runtime safe
///
/// From GetX Architects and for GetX Architects
/// with L<3VE
///
abstract class GetSuperProviderXXL implements IGetSuperProviderXXL {
static IGetSuperProviderXXL get I =>
_superInstance ??= _GetSuperProviderXXLImpl();
static IGetSuperProviderXXL? _superInstance;
GetSuperProviderXXL._();
}
abstract class _GetSuperProviderXXLBase extends GetSuperProviderXXL {
_GetSuperProviderXXLBase() : super._();
}
class _GetSuperProviderXXLImpl = _GetSuperProviderXXLBase
with
MapMixin<IGetSuperProviderXXLKey, IGetSuperProviderXXLValue>,
_SuperStoreMixin,
_SuperStreamMixin,
_SuperGetMixin,
_SuperRepresentationMixin,
_SuperHashMixin;
mixin _SuperStoreMixin on GetSuperProviderXXL {
final Map<IGetSuperProviderXXLKey, IGetSuperProviderXXLValue> _map =
<IGetSuperProviderXXLKey, IGetSuperProviderXXLValue>{};
@override
Object? operator [](IGetSuperProviderXXLKey key) => _map[key];
@override
void operator []=(
IGetSuperProviderXXLKey key,
IGetSuperProviderXXLValue value,
) =>
_map[key] = value;
@override
void clear() => _map.clear();
@override
Iterable<IGetSuperProviderXXLKey> get keys => _map.keys;
@override
void remove(IGetSuperProviderXXLKey key) => _map.remove(key);
}
mixin _SuperStreamMixin on GetSuperProviderXXL {
// ignore: close_sinks
StreamController<IGetSuperProviderXXLValue>? __controller;
StreamController<IGetSuperProviderXXLValue> get _controller =>
__controller ??= StreamController<Object?>.broadcast();
@override
void operator []=(
IGetSuperProviderXXLKey key,
IGetSuperProviderXXLValue value,
) {
super[key] = value;
_controller.add(value);
}
@override
Stream<IGetSuperProviderXXLValue> get stream => _controller.stream;
}
mixin _SuperHashMixin on GetSuperProviderXXL {
@override
int get hashCode => 0;
@override
bool operator ==(Object other) => identical(other, this);
}
mixin _SuperRepresentationMixin on GetSuperProviderXXL {
@override
String toString() => (StringBuffer()
..writeln('GET SUPER PROVIDER XXL')
..writeln('From GetX Architects and for GetX Architects with L <3 V E'))
.toString();
}
mixin _SuperGetMixin on GetSuperProviderXXL {
@override
T? getAs<T extends IGetSuperProviderXXLValue>(IGetSuperProviderXXLKey key) {
final obj = super[key];
return obj is T ? obj : null;
}
}
/// EXAMPLE:
void main() {
const value = 'hello world';
// ignore: avoid_print
getXXL.stream.take(1).listen(print);
null.getXXL[#key] = value;
// ignore: avoid_print
print(GetSuperProviderXXL.I.getAs<String>(#key));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment