Skip to content

Commit ee4bde8

Browse files
authored
Merge pull request #133 from rishabhdeepsingh/nullable_num
2 parents 1536c6e + 9e878ab commit ee4bde8

File tree

4 files changed

+92
-0
lines changed

4 files changed

+92
-0
lines changed

example/main.dart

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ void main() {
2828
[4, 5, 6]
2929
];
3030
final flattened = nestedList.flatten(); // [1, 2, 3, 4, 5, 6]
31+
32+
123.0.minus(null); // 123.0
3133
}
3234

3335
class Dog {

lib/dartx.dart

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import 'package:crypto/crypto.dart' as crypto;
1313
export 'package:characters/characters.dart';
1414
export 'package:time/time.dart';
1515

16+
part 'src/arithmetic.dart';
1617
part 'src/comparable.dart';
1718
part 'src/comparator.dart';
1819
part 'src/function.dart';

lib/src/arithmetic.dart

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
part of dartx;
2+
3+
extension NumArithmeticX<T extends num> on T {
4+
/// Minus val if if it not null else returns `this`
5+
T? minus(T? val) => val == null ? this : this - val as T?;
6+
7+
/// returns null if val is null else returns `this` - val
8+
T? minusOrNull(T? val) => val == null ? null : this - val as T?;
9+
10+
/// Adds val if if it not null else returns `this`
11+
T? plus(T? val) => val == null ? this : this + val as T?;
12+
13+
/// returns null if val is null else returns `this` + val
14+
T? plusOrNull(T? val) => val == null ? null : this + val as T?;
15+
}

test/arithmetic_test.dart

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import 'package:test/test.dart';
2+
import 'package:dartx/dartx.dart';
3+
4+
void main() {
5+
group('num', () {
6+
test('num?.plus() and num?.minus()', () {
7+
const num? value = null;
8+
expect(value?.minus(1), null);
9+
expect(value?.minus(1) ?? -1, -1);
10+
expect((value ?? 0) - 1, -1);
11+
12+
expect(value?.plus(1), null);
13+
expect(value?.plus(1) ?? 1, 1);
14+
expect((value ?? 0) + 1, 1);
15+
});
16+
test('num?.plusOrNull() and num?.minusOrNull()', () {
17+
const num? value = null;
18+
const num one = 1;
19+
expect(one.plus(value), 1);
20+
expect(one.plusOrNull(value), null);
21+
expect(one.plusOrNull(value) ?? 1, 1);
22+
23+
expect(one.minus(value), 1);
24+
expect(one.minusOrNull(value), null);
25+
expect(one.minusOrNull(value) ?? 1, 1);
26+
});
27+
});
28+
29+
group('int', () {
30+
test('int?.plus() and int?.minus()', () {
31+
const int? value = null;
32+
expect(value?.minus(1), null);
33+
expect(value?.minus(1) ?? -1, -1);
34+
expect((value ?? 0) - 1, -1);
35+
36+
expect(value?.plus(1), null);
37+
expect(value?.plus(1) ?? 1, 1);
38+
expect((value ?? 0) + 1, 1);
39+
});
40+
test('int?.plusOrNull() and int?.minusOrNull()', () {
41+
const int? value = null;
42+
expect(1.plus(value), 1);
43+
expect(1.plusOrNull(value), null);
44+
expect(1.plusOrNull(value) ?? 1, 1);
45+
46+
expect(1.minus(value), 1);
47+
expect(1.minusOrNull(value), null);
48+
expect(1.minusOrNull(value) ?? 1, 1);
49+
});
50+
});
51+
52+
group('double', () {
53+
test('double?.plus() and double?.minus()', () {
54+
const double? value = null;
55+
expect(value?.minus(1), null);
56+
expect(value?.minus(1) ?? -1, -1);
57+
expect((value ?? 0) - 1, -1);
58+
59+
expect(value?.plus(1), null);
60+
expect(value?.plus(1) ?? 1, 1);
61+
expect((value ?? 0) + 1, 1);
62+
});
63+
test('double?.plusOrNull() and double?.minusOrNull()', () {
64+
const double? value = null;
65+
expect(1.0.plus(value), 1.0);
66+
expect(1.0.plusOrNull(value), null);
67+
expect(1.0.plusOrNull(value) ?? 1.0, 1.0);
68+
69+
expect(1.0.minus(value), 1.0);
70+
expect(1.0.minusOrNull(value), null);
71+
expect(1.0.minusOrNull(value) ?? 1.0, 1.0);
72+
});
73+
});
74+
}

0 commit comments

Comments
 (0)