1 /// 2 module scrapd.let; 3 4 /// 5 template let(alias fun) 6 { 7 auto ref T let(T)(auto ref T obj) 8 { 9 fun(obj); 10 return obj; 11 } 12 } 13 14 /// 15 unittest 16 { 17 struct Test 18 { 19 string name; 20 int age; 21 } 22 23 auto test = Test().let!((ref test) => test.name = "A"); 24 assert(test.name == "A"); 25 } 26 27 /// 28 unittest 29 { 30 struct Test 31 { 32 string name; 33 int age; 34 } 35 36 auto test = Test().let!((ref test) => test.age = 10); 37 assert(test.age == 10); 38 } 39 40 /// 41 unittest 42 { 43 struct Test 44 { 45 string name; 46 int age; 47 } 48 49 auto test = Test().let!((ref test) { test.name = "TEST"; test.age = 10; }); 50 assert(test.name == "TEST"); 51 assert(test.age == 10); 52 } 53 54 unittest 55 { 56 struct Test 57 { 58 string name; 59 } 60 61 alias withName = (ref obj) { obj.name = "TEST"; }; 62 63 auto test = Test().let!withName; 64 assert(test.name == "TEST"); 65 } 66 67 unittest 68 { 69 import std.algorithm : move; 70 71 struct Test 72 { 73 string name; 74 } 75 76 Test test; 77 test = move(test).let!((ref obj) { obj.name = "TEST"; }); 78 assert(test.name == "TEST"); 79 } 80 81 unittest 82 { 83 import std.algorithm : move; 84 85 struct Test 86 { 87 string name; 88 } 89 90 alias withName = (ref obj) { obj.name = "TEST"; }; 91 92 Test test; 93 test = move(test).let!withName; 94 assert(test.name == "TEST"); 95 }