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 }