- #190
KtMutableMapEntry.setValue()is now implemented (thx @hugobrancowb) - #188 Added
KtIterable.firstNotNullOf()KtIterable.firstNotNullOfOrNull()(thx @hugobrancowb) - #196 Methods, returning mutated copies are now marked with
@useReslt(thx @nohli) - #197
mapNotNull,mapNotNullTo,mapIndexedNotNull,mapIndexedNotNullTo,filterNotNullTowork now correctly for non-nullable types
- #183 New:
KtIterable.sumOfthx @nohli - Update dependencies and guarantee compatibility with Dart 2.12-2.18
Some nullsafety improvements, type fixes and a lot of new Kotlin 1.4 extensions
-
#141 Fix:
requireNoNulls()now convertsT?toT -
1df6e1a Fix:
.dartand.iteronIterable<T>now work for all types not only ifT implements Comparable -
f43cbc5 Fix:
*NotNullmethods now return non-nullable types -
b727893 Fix: The hashcode of all collections doesn't get cached anymore. That caused problems when mutable items in a
KtListchanged. TheequalsandhashCodemethods now always change together. -
#142 Improve:
KtIterable.onEachcan now be chained -
#141 New:
KtIterable.cast()to manually cast values -
#142 New:
KtIterable.onEachIndexed -
#163 New:
KtIterable.shuffled() -
#166 New:
KtIterable.reduceOrNull() -
#169 New:
KtMutableList.removeFirst()KtMutableList.removeLast() -
#173 New:
KtMutableList.removeFirstOrNull()KtMutableList.removeLastOrNull() -
#171 New:
KtIterable.minOf() -
#165 New:
String.replaceFirstChar() -
#170 New:
KtIterable.minOrNull(),KtIterable.maxOrNull(), deprecatesKtIterable.min(),KtIterable.max(), -
#174 New:
KtIterable.runningReduce() -
#177 New:
KtCollection.randomOrNull() -
#178 New:
KtIterable.flatMapIndexed,KtIterable.flatMapIndexedTo
Thanks to the #hacktoberfest contributors @Anas35, @robiness, @MatthaiosSait, @Dev-dfm, @marciokuroki, @Rishabh-Negi
- #138 Deprecate
KtIterable<T>.sumByDoublein favor ofKtIterable<T>.sumBywhich now works forintanddouble - #140
KtMap.getOrDefaultnow returnsVinstead ofV? - #140 Fix
KtMap.groupByreturningKtMap<K, KtMutableList<T>>instead ofKtMap<K, KtList<T>>causing generic type problems in further processing
- stable dependencies
- Improve
KtSet.containsperformance
- Migrate to Dart 2.12 with [null-safety(https://dart.dev/null-safety) support
New package:kt_dart/standard.dart library containing Kotlins loved standard extensions
- #120 Standard extensions
let,also,takeIfandtakeUnless - #120
TODO([String message])top-level function which throwsNotImplementedException - #120
repeat(int times, void Function(int) action)top-level function
More cool updates
- #124
KtList.ofandKtSet.ofnow allownullas parameters. Same forlistOfandsetOf - #131 Chain Comparators with the new
thenByandthenByDescendingfunctions. - #126 Allow const
.empty()constructors forKtList,KtMapandKtSet(Thanks @TimWhiting) - #127
plus,minusoperator overrides forKtSet, returningKtSetand notKtListas theKtIterableoperators do
- #124
KtList.ofandKtSet.ofnow allownullas parameters. Same forlistOfandsetOf - #120 Standard extensions
let,also,takeIfandtakeUnless - #120
TODO([String message])top-level function which throwsNotImplementedException - #120
repeat(int times, void Function(int) action)top-level function - #126 Allow const
.empty()constructors forKtList,KtMapandKtSet(Thanks @TimWhiting) - #127
plus,minusoperator overrides forKtSet, returningKtSetand notKtListas theKtIterableoperators do
- Fix unused import
The library has be upgrade to use Static Extension Methods.
This update also includes extensions for Dart collections which allow easy interoperability between dart and kt.dart collections using the .kt and .dart getters.
// New: Converting dart collections to KtDart collections (mutable views)
final KtMutableList<String> ktList = ["hey"].kt;
final KtMutableSet<String> ktSet = {"hey"}.kt;
final KtMutableMap<String, int> ktMap = {"hey": 1}.kt;
// Converting KtDart collections to dart collections
final List<String> dartList = KtList.of("hey").dart;
final Set<String> dartSet = KtSet.of("hey").dart;
final Map<String, int> dartMap = KtMap.from({"hey": 1}).dart;Note: ["Hello", "World"].kt returns a KtMutableList<String> and mutations are reflected on the original dart list. It is not a copy! Because it doesn't copy it is very cheap and only syntax sugar.
To convert dart collections to their immutable kt.dart counterparts use: .toImmutableList(), .toImmutableSet(), .toImmutableMap()
// New: Make dart collections immutable
final KtList<String> list = ["hey"].toImmutableList();
final KtSet<String> set = {"hey"}.toImmutableSet();
final KtMap<String, int> map = {"hey": 1}.toImmutableMap();- Relax
sortBy/sortByDescending,maxBy/minBytyping to work better with ints and doubles #116
// Was: int doesn't not implement Comparable<int> but Comparable<num>
// minBy therefore required some help to figure out the correct type (<num>)
users.minBy<num>((it) => it.age);
// Now: minBy doesn't require the Comparable (num) to have the same same as the value (int).
users.minBy((it) => it.age);- Remove unnecessary generic
RfromKtIterable.zipWithNext#118
KtPairandKtTriplenow have a newtoList()function to convert the values to aKtListKtList?.orEmpty()returns an empty list when the list isnullKtSet?.orEmpty()returns an empty set when the set isnullKtMap?.orEmpty()returns an empty map when the map isnullKtMap.ifEmpty(() -> defaultValue)returns the default value when the map is emptyKtIterable<KtIterable<T>>.flatten()flattens the nested collections toKtIterable<T>KtIterable<KtPair<T, U>>.unzip(): KtPair<KtList<T>, KtList<U>>unzips list of pairs to list of their first and second valuesKtIterable<Comparable<T>>.min()returns the smallest element of any comparable iterableKtIterable<Comparable<T>>.max()returns the largest element of any comparable iterable
- New extension
Iterable.toImmutableList(): KtList - New extension
Iterable.toImmutableSet(): KtSet - New extension
KtIterable<num>.average(): double - Relax
sortBy/sortByDescending,maxBy/minBytyping to work better with ints and doubles
// Was: int doesn't not implement Comparable<int> but Comparable<num>
// minBy therefore required some help to figure out the correct type (<num>)
users.minBy<num>((it) => it.age);
// Now: minBy doesn't require the Comparable (num) to have the same same as the value (int).
users.minBy((it) => it.age);- Rename
(List|Set|Map).immutable()extension to.toImmutableList()to match Dart SDK naming schema. - Remove
int.rangeTo(X)extension. Please use thedartxas replacement which offers the same extension - Remove
T.to(X)extension to create aKtPair. It's too general and should be offered by the dart SDK not a 3rd party package
New .dart extensions to convert KtDart collections back to dart collections.
// New: Converting dart collections to KtDart collections (mutable views)
final KtMutableList<String> ktList = ["hey"].kt;
final KtMutableSet<String> ktSet = {"hey"}.kt;
final KtMutableMap<String, int> ktMap = {"hey": 1}.kt;
// Converting KtDart collections to dart collections
final List<String> dartList = KtList.of("hey").dart;
final Set<String> dartSet = KtSet.of("hey").dart;
final Map<String, int> dartMap = KtMap.from({"hey": 1}).dart;KtDart makes full use of darts static extension methods, introduced with Dart 2.6.
The public API stays unchanged and is backwards compatible.
It is now easier then ever to convert dart to ktdart collections and vice versa. Use the .kt property to convert dart collections to KtDart collections. (Note: .kt create a view, which allows you to mutate the original dart collection).
// New: Make dart collections immutable
final KtList<String> list = ["hey"].immutable();
final KtSet<String> set = {"hey"}.immutable();
final KtMap<String, int> map = {"hey": 1}.immutable();
// New: Converting dart collections to KtDart collections (mutable views)
final KtMutableList<String> ktList = ["hey"].kt;
final KtMutableSet<String> ktSet = {"hey"}.kt;
final KtMutableMap<String, int> ktMap = {"hey": 1}.kt;
// Converting KtDart collections to dart collections
final List<String> dartList = KtList.of("hey").asList();
final Set<String> dartSet = KtSet.of("hey").asSet();
final Map<String, int> dartMap = KtMap.from({"hey": 1}).asMap();KtPairs can now created with the T0.to(T1) extension.
final KtPair<String, int> pair = "foo".to(42);Also, KtPair and KtTriple now have a new toList() function to convert the values to a KtList.
KtList?.orEmpty()returns an empty list when the list isnullKtSet?.orEmpty()returns an empty set when the set isnullKtMap?.orEmpty()returns an empty map when the map isnullKtMap.ifEmpty(() -> defaultValue)returns the default value when the map is emptyKtIterable<KtIterable<T>>.flatten()flattens the nested collections toKtIterable<T>KtIterable<KtPair<T, U>>.unzip(): KtPair<KtList<T>, KtList<U>>unzips list of pairs to list of their first and second valuesKtIterable<Comparable<T>>.min()returns the smallest element of any comparable iterableKtIterable<Comparable<T>>.max()returns the largest element of any comparable iterable
- #96 Dart 2.0.0 comparability. (Was only Dart 2.1.0 compatible).
- #97 Fix broken links to lib classes in documentation
- #97 Adjust analyzer rules. Add new ones and explain why others aren't active. Adjusted the code accordingly
- #92 Improve pub score by changing comments to
///
This major update of kt.dart add 10+ extension methods for KtMap and makes working with maps even easier.
The properties KtList.list: List,KtSet.set: Set are now deprecated and KtMap.map: Map was removed. Those properties where used to convert kt.dart collections to dart collections.
Instead use the new KtList.asList(): List, KtSet.asSet(): Set, KtMa.asMap(): Map methods.
The old properties returned copies of the collections.
The new as-methods return views of the original collections and reflect changes of the original data.
This breaking change was necessary because the property KtMap.map: Map<K, V> was conflicting with KtMap.map(MapEntry<K, V> -> R) : KtList<R> to map the entries to items of a KtList.
Read about further details here.
If you have used properties to iterate over the collections using a for-loop you should now always use iter which is available for all kt.dart collections.
for (final element in listOf("a", "b", "c").iter) {
print(element);
}
for (final element in setOf("a", "b", "c").iter) {
print(element);
}
for (final p in mapFrom({1: "Bulbasaur", 2: "Ivysaur"}).iter) {
print("${p.key} -> ${p.value}");
}- #86 New:
KtMap.mapReturns a list containing the results of applying the giventransformfunction to each entry in the original map. - #86 New:
KtMap.iterAccess to aIterableto be used in for-loops - #87 New:
KtMap.countReturns the number of entries matching the given [predicate] or the number of entries whenpredicate = null. - #89 New:
KtMap.minByReturns the first entry yielding the smallest value of the given function ornullif there are no entries. - #89 New:
KtMap.minWithReturns the first entry having the smallest value according to the providedcomparatorornullif there are no entries. - #89 New:
KtMap.maxByReturns the first entry yielding the largest value of the given function ornullif there are no entries. - #89 New:
KtMap.maxWithReturns the first entry having the largest value according to the providedcomparatorornullif there are no entries. - #90 New:
KtMap.toListReturns aKtListcontaining all key-value pairs. - #78 New:
KtMap.forEachPerforms givenactionon each key/value pair from this map. thanks @acherkashyn - #80 New:
KtMap.noneReturnstrueif there is no entries in the map that match the givenpredicate. thanks @acherkashyn - #80 New:
KtMap.allReturns true if all entries match the givenpredicate. thanks @acherkashyn - #80 New:
KtMap.anyReturns true if there is at least one entry that matches the givenpredicate. thanks @acherkashyn - #84 New:
KtMap.filterKeysReturns a map containing all key-value pairs with keys matching the givenpredicate. - #84 New:
KtMap.filterValuesReturns a map containing all key-value pairs with values matching the givenpredicate. - #79 New:
KtMap.asMapReturns a read-only dart:coreMap - #79 New:
KtMutableMap.asMapCreates aMapinstance that wraps the originalKtMap. It acts as a view.
- #75 New:
KtIterable.takeWhileReturns a list containing first elements satisfying the givenpredicate. - #76 New:
KtIterable.takeLastWhileReturns a list containing last elements satisfying the givenpredicate.
- #73 New:
KtList.takeLast, Returns a list containing lastnelements. - #79 New:
KtList.asListReturns a read-only dart:coreList - #79 New:
KtMutableList.asListCreates aListinstance that wraps the originalKtList. It acts as a view.
- #79, #91 New:
KtSet.asSetReturns a read-only dart:coreSet - #79 New:
KtMutableSet.asSetCreates aSetinstance that wraps the originalKtSet. It acts as a view.
- #69
KtMutableListIteratorthrowsIndexOutOfBoundsExceptionwhen callingsetbeforenextwas called - #81 Force dartfmt on CI
- #83 Improve .gitignore
Project has been renamed to kt.dart. If you're using a previous version upgrade like this:
pubspec.yaml
dependencies:
- dart_kollection: ^0.3.0
- kotlin_dart: ^0.4.0
+ kt_dart: ^0.5.0your_source.dart
- import 'package:dart_kollection/dart_kollection.dart';
- import 'package:kotlin_dart/kotlin.dart';
+ import 'package:kt_dart/kt.dart';Deprecate package kotlin_dart and recommend users to migrate to kt_dart.
Shorten pub project description to make pana happy.
Improve Readme which renders correctly on pub.
The kollection project was migrated to kotlin.dart where kollection becomes the collection module.
pubspec.yaml
dependencies:
- dart_kollection: ^0.3.0
+ kotlin_dart: ^0.4.0your_source.dart
- import 'package:dart_kollection/dart_kollection.dart';
+ import 'package:kotlin_dart/kotlin.dart';- #64 The class prefix of all collections has been changed from
KtoKt(KList->KtList) - #60
listOfnow accepts up to 10 non-null arguments instead of anIterable. UselistFromto createKtLists from an dartIterables - #60 Collections can now be created with factory constructors i.e.
KtList.of(1, 2 ,3). Both APIs, factory constructor and function based one, are equally supported. It only depends on your personal taste.
Here is a list of all collection creation APIs.
/// List
// Create immutable lists
emptyList<int>();
listOf(1, 2, 3, 4, 5);
listFrom([1, 2, 3, 4, 5]);
// Create mutable lists
mutableListOf(1, 2, 3, 4, 5);
mutableListFrom([1, 2, 3, 4, 5]);
/// Set
// Create immutable sets
emptySet<int>();
setOf(1, 2, 3, 4, 5);
setFrom([1, 2, 3, 4, 5]);
// Create a mutable set which keeps the order of the items
linkedSetOf(1, 2, 3, 4, 5);
linkedSetFrom([1, 2, 3, 4, 5]);
// Create mutable, unordered hash-table based set
hashSetOf(1, 2, 3, 4, 5);
hashSetFrom([1, 2, 3, 4, 5]);
/// Map
// Create immutable maps
emptyMap<int, String>();
mapFrom({1: "a", 2: "b"});
// Create mutable maps
mutableMapFrom({1: "a", 2: "b"});
// Create mutable maps without specified order when iterating over items
hashMapFrom({1: "a", 2: "b"});
// Create mutable maps which keep the order of the items
linkedMapFrom({1: "a", 2: "b"}); /// List
// Create immutable lists
KList<int>.empty();
KList.of(1, 2, 3, 4, 5);
KList.from([1, 2, 3, 4, 5]);
// Create mutable lists
KMutableList<int>.empty();
KMutableList.of(1, 2, 3, 4, 5);
KMutableList.from([1, 2, 3, 4, 5]);
/// Set
// Create immutable sets
KSet<int>.empty();
KSet.of(1, 2, 3, 4, 5);
KSet.from([1, 2, 3, 4, 5]);
// Create a mutable set which keeps the order of the items
KMutableSet<int>.empty();
KMutableSet.of(1, 2, 3, 4, 5);
KMutableSet.from([1, 2, 3, 4, 5]);
// Create mutable, unordered hash-table based set
KHashSet<int>.empty();
KHashSet.of(1, 2, 3, 4, 5);
KHashSet.from([1, 2, 3, 4, 5]);
// Create a mutable set which keeps the order of the items
KLinkedSet<int>.empty();
KLinkedSet.of(1, 2, 3, 4, 5);
KLinkedSet.from([1, 2, 3, 4, 5]);
/// Map
// Create mutable maps
KMutableMap<int, String>.empty();
KMutableMap.from({1: "a", 2: "b"});
// Create mutable maps without specified order when iterating over items
KHashMap<int, String>.empty();
KHashMap.from({1: "a", 2: "b"});
// Create mutable maps which keep the order of the items
KLinkedMap<int, String>.empty();
KLinkedMap.from({1: "a", 2: "b"});Deprecate package dart_kollection in favour of kt_dart
Deprecate all APIs and advise users to upgrade to kotlin.dart
This release of Kollection fully covers the project with unit tests, from 52% to 99% 🎉. By doing that bugs where discovered and fixed.
Because Dart doesn't support non-nullable types yet, this update manually checks all method arguments at runtime.
Passing null in any method will throw ArgumentError unless documented otherwise.
- #36 All method arguments are now validated for nullability. If a argument isn't documented as "nullable" the method will throw
ArgumentError(when asserts are enabled) - #51, #46
KIterable<T>.associateWithTo,Kiterable<T>.filterTo,KIterable<T>.filterIndexedTo,KIterable<T>.filterNotTo,KIterable<T>.filterNotNullTo,KIterable<T>.groupByTo,KMap<T>.mapKeysTo,KMap<T>.mapValuesTo,KIterable.toCollectiondid not compile when called directly due to dart-lang/sdk/issues/35518. The type ofdestinationof those methods has been changed to a dynamic type (i.e.KMutableList<T>->KMutableList<dynamic>). Those methods will now be checked at runtime. This has one advantage: It allows to pass in contravariant types.
final KIterable<int> iterable = listOf([4, 25, -12, 10]);
final result = mutableListOf<num>(); // covariant!
final filtered = iterable.filterIndexedTo(result, (i, it) => it < 10);
expect(identical(result, filtered), isTrue);
expect(result, listOf([4, -12]));- #56
KMutableEntry.setValuenow throwsUnimplementedErrorbecause of bug #55. It anyways never worked. - #58
KSetdoesn't allow mutation of its elements with viasetgetter. It is now really immutable.
-
#38 Breaking: Removed
hashMapFrom(KIterable<KPair>)because, unlike Kotlin, it feels unnatural in Dart. Instead usehashMapOfto construct aKMutableMap -
#17 Breaking:
KMap.associateBynow takes only a single parameter (K Function(T) keySelector). If you usedvalueTransformuseKMap.associateByTransformas replacement -
#23 New
KMutableList.[]=operator. Example:list[4] = "Hello" -
#47 New
KMapmethodsfilter,filterTo,filterNot,filterNotTo, -
#37
KCollection.randomnow optionally accepts aRandomas argument which can be seeded -
#39
KMutableList.removeAtnow throwsIndexOutOfBoundsExceptionwhenindexexceeds length or is negative -
#18
KMutableCollection:addAll,removeAllandretainAllnow receiveKIterableas parameter, wasKCollection
- #18 Fixed
KList.firststackoverflow - #44 Fixed
Klist.singlestackoverflow - #24 Fixed
KList.lastwhich returnedfirst - #20 Fixed
KIterable.firstOrNullwhich threwNoSuchElementExceptionfor empty lists, now returnsnull - #22 Fixed
KIterable.mapIndexedTo,KIterable.mapIndexedNotNullTocouldn't be called due to a generic compilation error - #26 Fixed
KList.containsAllreturned false when all elements ar in list - #28 Fixed
KListIterator.nextIndexwas off by one, now returns the index of the element which will be returned bynext() - #30 Fixed
KMutableList.sortByandsortByDescendingnot sorting theKMutableListbut a copy - #31 Fixed
KIterable.nonealways returnedtrue(Was always working forKCollection) - #51 Fixed
KSet.==()returns false forsetOf<int>([1, 2, 3]) == setOf<num>([1, 2, 3])
- #57 Document
hashSetOfandlinkedSetOf - #19
KIterable.anydocument return value when called withoutpredicate - #51 Document expected type of now dynamically typed
KIterable<T>.associateWithTo,Kiterable<T>.filterTo,KIterable<T>.filterIndexedTo,KIterable<T>.filterNotTo,KIterable<T>.filterNotNullTo,KIterable<T>.groupByTo,KMap<T>.mapKeysTo,KMap<T>.mapValuesTo,KIterable.toCollection
- Added a lot of tests #19, #27, #32, #33, #34, #35, #39, #40, #41, #42, #43, #45, #53, #54, #58,
- #48, #49, #50, #59 Activated many lint checks
- #25
tool/run_coverage_locally.shnow installs deps only when not installed and prints resulting HTML report path
- #1 Add
Set<T> get setreturning the internal dart set - #1 Add
Map<K, V> get mapreturning the intenral dart set - #7 Add
KMap.toMapandKMap.toMutableMap - #8 Add
KMap.isNotEmpty - 3e3228e Add
KMap.toString() - #9 Add
Map.plus,Map.minusandoperator +(KMap<K, V> map),operator -(K key) - #12 Remove const constructors from collection interfaces
- #13 Remove default implementations from collection interfaces
- #15 Add documentation for
compareByandcompareByDescending
- #2 Travis CI #2
- #3, #4 Code coverage
- #10 Test
KMutableList.fill - #11 Test
KPair,KTriple - #14 Test Exceptions
- #15 Test Comparators
naturalOrder(),reverseOrder() - #15 Test
reverse(Comparator)util function - 6dd0d85 Reformatted with dartfmt (80 chars)
Initial release for
KList/KMutableListKSet/KMutableSetKMap/KMutableMap
with tons of extensions waiting for you to use them!