Jonatas

added RxSet

1 -typedef ValueCallback<T> = Function(T v);  
1 import 'dart:async'; 1 import 'dart:async';
2 -  
3 import 'package:flutter/scheduler.dart'; 2 import 'package:flutter/scheduler.dart';
4 -import 'package:get/src/state_manager/rx/rx_callbacks.dart'; 3 +import 'rx_typedefs.dart';
5 4
6 /// This class is the foundation for all reactive (Rx) classes that makes Get 5 /// This class is the foundation for all reactive (Rx) classes that makes Get
7 /// so powerful. 6 /// so powerful.
@@ -6,14 +6,17 @@ import 'rx_impl.dart'; @@ -6,14 +6,17 @@ import 'rx_impl.dart';
6 import 'rx_interface.dart'; 6 import 'rx_interface.dart';
7 import 'rx_typedefs.dart'; 7 import 'rx_typedefs.dart';
8 8
  9 +
9 /// Create a list similar to `List<T>` 10 /// Create a list similar to `List<T>`
10 class RxList<E> implements List<E>, RxInterface<List<E>> { 11 class RxList<E> implements List<E>, RxInterface<List<E>> {
11 RxList([List<E> initial]) { 12 RxList([List<E> initial]) {
12 _list = initial; 13 _list = initial;
13 } 14 }
14 15
  16 + List<E> _list = <E>[];
  17 +
15 @override 18 @override
16 - Iterator<E> get iterator => _list.iterator; 19 + Iterator<E> get iterator => value.iterator;
17 20
18 @override 21 @override
19 bool get isEmpty => value.isEmpty; 22 bool get isEmpty => value.isEmpty;
@@ -193,8 +196,6 @@ class RxList<E> implements List<E>, RxInterface<List<E>> { @@ -193,8 +196,6 @@ class RxList<E> implements List<E>, RxInterface<List<E>> {
193 void bindStream(Stream<Iterable<E>> stream) => 196 void bindStream(Stream<Iterable<E>> stream) =>
194 stream.listen((va) => value = va); 197 stream.listen((va) => value = va);
195 198
196 - List<E> _list = <E>[];  
197 -  
198 @override 199 @override
199 E get first => _list.first; 200 E get first => _list.first;
200 201
  1 +import 'dart:async';
  2 +
  3 +import 'package:flutter/foundation.dart';
  4 +
  5 +import 'rx_impl.dart';
  6 +import 'rx_interface.dart';
  7 +import 'rx_typedefs.dart';
  8 +
  9 +class RxSet<E> implements Set<E>, RxInterface<Set<E>> {
  10 + RxSet([Set<E> initial]) {
  11 + _list = initial;
  12 + }
  13 +
  14 + RxSet<E> _list = Set<E>();
  15 +
  16 + @override
  17 + Iterator<E> get iterator => value.iterator;
  18 +
  19 + @override
  20 + bool get isEmpty => value.isEmpty;
  21 +
  22 + bool get canUpdate {
  23 + return _subscriptions.length > 0;
  24 + }
  25 +
  26 + @override
  27 + bool get isNotEmpty => value.isNotEmpty;
  28 +
  29 + StreamController<Set<E>> subject = StreamController<Set<E>>.broadcast();
  30 + Map<Stream<Set<E>>, StreamSubscription> _subscriptions = Map();
  31 +
  32 + /// Adds [item] only if [condition] resolves to true.
  33 + void addIf(condition, E item) {
  34 + if (condition is Condition) condition = condition();
  35 + if (condition is bool && condition) add(item);
  36 + }
  37 +
  38 + /// Adds all [items] only if [condition] resolves to true.
  39 + void addAllIf(condition, Iterable<E> items) {
  40 + if (condition is Condition) condition = condition();
  41 + if (condition is bool && condition) addAll(items);
  42 + }
  43 +
  44 + operator []=(int index, E val) {
  45 + _list[index] = val;
  46 + subject.add(_list);
  47 + }
  48 +
  49 + /// Special override to push() element(s) in a reactive way
  50 + /// inside the List,
  51 + RxSet<E> operator +(Iterable<E> val) {
  52 + addAll(val);
  53 + subject.add(_list);
  54 + return this;
  55 + }
  56 +
  57 + @override
  58 + bool add(E value) {
  59 + final val = _list.add(value);
  60 + subject.add(_list);
  61 + return val;
  62 + }
  63 +
  64 + void addAll(Iterable<E> item) {
  65 + _list.addAll(item);
  66 + subject.add(_list);
  67 + }
  68 +
  69 + /// Adds only if [item] is not null.
  70 + void addNonNull(E item) {
  71 + if (item != null) add(item);
  72 + }
  73 +
  74 + /// Adds only if [item] is not null.
  75 + void addAllNonNull(Iterable<E> item) {
  76 + if (item != null) addAll(item);
  77 + }
  78 +
  79 + void insert(int index, E item) {
  80 + _list.insert(index, item);
  81 + subject.add(_list);
  82 + }
  83 +
  84 + void insertAll(int index, Iterable<E> iterable) {
  85 + _list.insertAll(index, iterable);
  86 + subject.add(_list);
  87 + }
  88 +
  89 + int get length => value.length;
  90 +
  91 + /// Removes an item from the list.
  92 + ///
  93 + /// This is O(N) in the number of items in the list.
  94 + ///
  95 + /// Returns whether the item was present in the list.
  96 + bool remove(Object item) {
  97 + bool hasRemoved = _list.remove(item);
  98 + if (hasRemoved) {
  99 + subject.add(_list);
  100 + }
  101 + return hasRemoved;
  102 + }
  103 +
  104 + E removeAt(int index) {
  105 + E item = _list.removeAt(index);
  106 + subject.add(_list);
  107 + return item;
  108 + }
  109 +
  110 + E removeLast() {
  111 + E item = _list.removeLast();
  112 + subject.add(_list);
  113 + return item;
  114 + }
  115 +
  116 + void removeRange(int start, int end) {
  117 + _list.removeRange(start, end);
  118 + subject.add(_list);
  119 + }
  120 +
  121 + void removeWhere(bool Function(E) test) {
  122 + _list.removeWhere(test);
  123 + subject.add(_list);
  124 + }
  125 +
  126 + void clear() {
  127 + _list.clear();
  128 + subject.add(_list);
  129 + }
  130 +
  131 + void sort([int compare(E a, E b)]) {
  132 + _list.sort();
  133 + subject.add(_list);
  134 + }
  135 +
  136 + close() {
  137 + _subscriptions.forEach((observable, subscription) {
  138 + subscription.cancel();
  139 + });
  140 + _subscriptions.clear();
  141 + subject.close();
  142 + }
  143 +
  144 + /// Replaces all existing items of this list with [item]
  145 + void assign(E item) {
  146 + clear();
  147 + add(item);
  148 + }
  149 +
  150 + void update(void fn(Iterable<E> value)) {
  151 + fn(value);
  152 + subject.add(_list);
  153 + }
  154 +
  155 + /// Replaces all existing items of this list with [items]
  156 + void assignAll(Iterable<E> items) {
  157 + clear();
  158 + addAll(items);
  159 + }
  160 +
  161 + @protected
  162 + Set<E> get value {
  163 + if (getObs != null) {
  164 + getObs.addListener(subject.stream);
  165 + }
  166 + return _list;
  167 + }
  168 +
  169 + String get string => value.toString();
  170 +
  171 + addListener(Stream<Set<E>> rxGetx) {
  172 + if (_subscriptions.containsKey(rxGetx)) {
  173 + return;
  174 + }
  175 + _subscriptions[rxGetx] = rxGetx.listen((data) {
  176 + subject.add(data);
  177 + });
  178 + }
  179 +
  180 + set value(Iterable<E> val) {
  181 + if (_list == val) return;
  182 + _list = val;
  183 + subject.add(_list);
  184 + }
  185 +
  186 + Stream<Set<E>> get stream => subject.stream;
  187 +
  188 + StreamSubscription<Set<E>> listen(void Function(Set<E>) onData,
  189 + {Function onError, void Function() onDone, bool cancelOnError}) =>
  190 + stream.listen(onData, onError: onError, onDone: onDone);
  191 +
  192 + void bindStream(Stream<Iterable<E>> stream) =>
  193 + stream.listen((va) => value = va);
  194 +
  195 + @override
  196 + E get first => _list.first;
  197 +
  198 + @override
  199 + E get last => _list.last;
  200 +
  201 + @override
  202 + bool any(bool Function(E) test) {
  203 + return _list.any(test);
  204 + }
  205 +
  206 + @override
  207 + Set<R> cast<R>() {
  208 + return _list.cast<R>();
  209 + }
  210 +
  211 + @override
  212 + bool contains(Object element) {
  213 + return _list.contains(element);
  214 + }
  215 +
  216 + @override
  217 + E elementAt(int index) {
  218 + return _list.elementAt(index);
  219 + }
  220 +
  221 + @override
  222 + bool every(bool Function(E) test) {
  223 + return _list.every(test);
  224 + }
  225 +
  226 + @override
  227 + Iterable<T> expand<T>(Iterable<T> Function(E) f) {
  228 + return _list.expand(f);
  229 + }
  230 +
  231 + @override
  232 + E firstWhere(bool Function(E) test, {E Function() orElse}) {
  233 + return _list.firstWhere(test, orElse: orElse);
  234 + }
  235 +
  236 + @override
  237 + T fold<T>(T initialValue, T Function(T, E) combine) {
  238 + return _list.fold(initialValue, combine);
  239 + }
  240 +
  241 + @override
  242 + Iterable<E> followedBy(Iterable<E> other) {
  243 + return _list.followedBy(other);
  244 + }
  245 +
  246 + @override
  247 + void forEach(void Function(E) f) {
  248 + _list.forEach(f);
  249 + }
  250 +
  251 + @override
  252 + String join([String separator = ""]) {
  253 + return _list.join(separator);
  254 + }
  255 +
  256 + @override
  257 + E lastWhere(bool Function(E) test, {E Function() orElse}) {
  258 + return _list.lastWhere(test, orElse: orElse);
  259 + }
  260 +
  261 + @override
  262 + Iterable<T> map<T>(T Function(E) f) {
  263 + return _list.map(f);
  264 + }
  265 +
  266 + @override
  267 + E reduce(E Function(E, E) combine) {
  268 + return _list.reduce(combine);
  269 + }
  270 +
  271 + @override
  272 + E get single => _list.single;
  273 +
  274 + @override
  275 + E singleWhere(bool Function(E) test, {E Function() orElse}) {
  276 + return _list.singleWhere(test, orElse: orElse);
  277 + }
  278 +
  279 + @override
  280 + Iterable<E> skip(int count) {
  281 + return _list.skip(count);
  282 + }
  283 +
  284 + @override
  285 + Iterable<E> skipWhile(bool Function(E) test) {
  286 + return _list.skipWhile(test);
  287 + }
  288 +
  289 + @override
  290 + Iterable<E> take(int count) {
  291 + return _list.take(count);
  292 + }
  293 +
  294 + @override
  295 + Iterable<E> takeWhile(bool Function(E) test) {
  296 + return _list.takeWhile(test);
  297 + }
  298 +
  299 + @override
  300 + List<E> toList({bool growable = true}) {
  301 + return _list.toList(growable: growable);
  302 + }
  303 +
  304 + @override
  305 + Set<E> toSet() {
  306 + return _list.toSet();
  307 + }
  308 +
  309 + @override
  310 + Iterable<E> where(bool Function(E) test) {
  311 + return _list.where(test);
  312 + }
  313 +
  314 + @override
  315 + Iterable<T> whereType<T>() {
  316 + return _list.whereType<T>();
  317 + }
  318 +
  319 + @override
  320 + bool containsAll(Iterable<Object> other) {
  321 + return _list.containsAll(other);
  322 + }
  323 +
  324 + @override
  325 + Set<E> difference(Set<Object> other) {
  326 + return _list.difference(other);
  327 + }
  328 +
  329 + @override
  330 + Set<E> intersection(Set<Object> other) {
  331 + return _list.intersection(other);
  332 + }
  333 +
  334 + @override
  335 + E lookup(Object object) {
  336 + return _list.lookup(object);
  337 + }
  338 +
  339 + @override
  340 + void removeAll(Iterable<Object> elements) {
  341 + _list.removeAll(elements);
  342 + }
  343 +
  344 + @override
  345 + void retainAll(Iterable<Object> elements) {
  346 + _list.retainAll(elements);
  347 + }
  348 +
  349 + @override
  350 + void retainWhere(bool Function(E) E) {
  351 + _list.retainWhere(E);
  352 + }
  353 +
  354 + @override
  355 + Set<E> union(Set<E> other) {
  356 + return _list.union(other);
  357 + }
  358 +}
  359 +
  360 +extension SetExtension<E> on Set<E> {
  361 + RxSet<E> get obs {
  362 + if (this != null)
  363 + return RxSet<E>(<E>{})..addAllNonNull(this);
  364 + else
  365 + return RxSet<E>(null);
  366 + }
  367 +}
1 typedef bool Condition(); 1 typedef bool Condition();
  2 +typedef ValueCallback<T> = Function(T v);
1 import 'package:flutter/widgets.dart'; 1 import 'package:flutter/widgets.dart';
2 -import 'package:get/src/state_manager/rx/rx_obx.dart'; 2 +import 'package:get/src/state_manager/rx/rx_obx_widget.dart';
3 import 'get_state.dart'; 3 import 'get_state.dart';
4 4
5 class MixinBuilder<T extends GetxController> extends StatelessWidget { 5 class MixinBuilder<T extends GetxController> extends StatelessWidget {
@@ -7,6 +7,7 @@ export 'src/state_manager/rx/rx_interface.dart'; @@ -7,6 +7,7 @@ export 'src/state_manager/rx/rx_interface.dart';
7 export 'src/state_manager/rx/rx_impl.dart'; 7 export 'src/state_manager/rx/rx_impl.dart';
8 export 'src/state_manager/rx/rx_list.dart'; 8 export 'src/state_manager/rx/rx_list.dart';
9 export 'src/state_manager/rx/rx_map.dart'; 9 export 'src/state_manager/rx/rx_map.dart';
10 -export 'src/state_manager/rx/rx_event.dart';  
11 -export 'src/state_manager/rx/rx_obx.dart';  
12 -export 'src/state_manager/rx/rx_getbuilder.dart'; 10 +export 'src/state_manager/rx/rx_set.dart';
  11 +export 'src/state_manager/rx/rx_workers.dart';
  12 +export 'src/state_manager/rx/rx_obx_widget.dart';
  13 +export 'src/state_manager/rx/rx_getx_widget.dart';