1 module yyd.mashup;
2 
3 public import yyd.y;
4 
5 template __msg (string T) 
6 {
7     pragma(msg, T);
8     enum __msg = T;
9 }
10 
11 mixin template _msg (string T) 
12 {
13     alias _ = __msg!(T);
14     enum toString = "__msg!(\""~ T ~ "\")";
15 }
16 
17 mixin template _compilesD(string T)  {
18     enum toString = "__traits(compiles,"~T~")";
19     enum _ = mixin(toString);
20 }
21 
22 /*template __compilesD(string T) {
23     enum __compilesD = mixin("__traits(compiles,"~T~")");    
24 }*/
25 
26 unittest {
27     int x;
28     mixin _compilesD!(q{x=10}) _;
29     static assert(_._);
30     static assert(_y!_);
31     static assert(__toString!_ == "__traits(compiles,x=10)");
32 }
33 
34 unittest {
35     mixin _compilesD!(q{x=10});
36     static assert(!_);
37     static assert(toString == "__traits(compiles,x=10)");
38 }
39 
40 unittest {
41     int x;
42     mixin _compilesD!(q{x=10});
43     static assert(_);
44     static assert(toString == "__traits(compiles,x=10)");
45 }
46 
47 unittest {
48     mixin _compilesD!(q{x=10});
49     static assert(!_);
50     static assert(toString == "__traits(compiles,x=10)");
51 }
52 
53 
54 
55 unittest {
56     mixin _compilesD!(q{blah,blah}) _;
57     
58     static assert(_._ is false);
59     static assert(_y!_ is false);
60 
61     mixin _msg!(__toString!_);
62 
63     static assert(__toString!_ == "__traits(compiles,blah,blah)");
64     static assert(mixin(_.toString) is false);
65 }
66 
67 unittest {
68     mixin _msg!("Unit test") _;
69 
70     static assert(_.toString == "__msg!(\"Unit test\")");
71     static assert(__toString!_ == "__msg!(\"Unit test\")");
72     enum x = mixin(_.toString);
73     
74     mixin _toString!_ s;
75     static assert(__toString!s == "__toString!(\"__msg!(\"Unit test\")\")");
76     
77 }
78 
79 template __toString(alias T) 
80 if(is(typeof(T.toString)))
81 {
82     alias __toString = T.toString;
83 }
84 
85 template __toString(alias T) 
86 if(
87 	!is(typeof(T.toString))
88 	/*&& (
89 		is(typeof(T) == bool)
90 	)*/
91 )
92 {
93     alias __toString = T;
94 }
95 
96 
97 mixin template _toString(alias T) {
98     enum _ = __toString!T;
99     enum toString = "__toString!(\"" ~ _ ~ "\")";
100 }
101 
102 template __mixinD(string T) {
103     enum __mixinD = mixin(T);
104 } 
105 
106 mixin template _mixinD (string T) 
107 {
108     enum _ = mixin(T);
109     enum toString = "mixin(" ~ T ~ ")";
110 }
111 
112 mixin template _mixin_t (alias T = _identity, U ...) 
113 {
114     mixin T!U;
115 }
116 
117 unittest {
118 	template X() {
119 		struct _X {
120 			auto ten() { 
121 				return 10;
122 			}                
123 		}
124 	}
125     alias f = {
126         mixin _mixin_t!X;
127         return _X();
128     };
129     assert(f().ten == 10);
130 }
131 
132 mixin template _mixin_mt (alias T = _identity) 
133 {
134     mixin template _(U...) {
135         mixin T!U;
136     }
137 }
138 
139 unittest {
140 	
141 	// A mixin that generates a struct called GeneratedStruct.
142 	mixin template generateStruct() {
143 		struct GeneratedStruct {
144 			auto ten() { 
145 				return 10;
146 			}                
147 		}
148 	}
149 
150 	// Creates a new mixin template that pulls in generateStruct for the 
151 	// body.
152 	// Need to create an alias to the mixin before use.
153 	mixin _mixin_mt!generateStruct;	
154     alias generate = _;
155 	
156 	// Function that includes the mixin and returns an instance of the
157 	// struct defined within.
158     alias f = {
159         mixin generate;
160         return GeneratedStruct();
161     };
162 
163 	// GeneratedStruct isn't visible to the program.
164 	static assert(!is(typeof(GeneratedStruct)));
165 	
166 	// Create an instant of GeneratedStruct.
167     static assert(f().ten == 10);
168 }
169 
170 template mixin_t (alias T = _identity, U ...) 
171 {
172     mixin T!U mixin_t;
173 }
174 
175 mixin template mixin_all(T ...)
176 if(T.length == 0)
177 {}
178 
179 mixin template mixin_all(T ...)
180 if(T.length == 1)
181 {
182     alias _front = T[0];
183     mixin _front;
184 }
185 
186 mixin template mixin_all(T ...)
187 if(T.length > 1)
188 {
189     alias _front = T[0];
190     mixin _front;
191     mixin mixin_all!(T[1..$]);
192 }
193 
194 
195 mixin template _contract (alias Cond, alias Fnc = identity) 
196 {
197     template _ () 
198     if(Cond) 
199     {
200         alias _ = Fnc;
201     }
202     
203     template _ (U...) 
204     if(Cond) 
205     {
206         alias _ = Fnc!U;
207     }
208     
209     enum toString = q{
210 		template _ () 
211 		if(} ~ Cond ~ q{) 
212 		{
213 			alias _ = } ~ Fnc ~ q{;
214 		}
215 		
216 		template _ (U...) 
217 		if(} ~ Cond ~ q{) 
218 		{
219 			alias _ = } ~ Fnc ~ q{!U;
220 		}
221 		
222 	};
223 }
224 
225 mixin template _ncontract (alias Cond, alias Fnc = identity) 
226 {
227     mixin _contract!(!Cond,Fnc);
228 }
229 
230 unittest {
231     mixin _contract!(true,"Test");
232     static assert(_!() == "Test");
233 }
234 
235 unittest {
236     mixin _ncontract!(false,"Test");
237     static assert(_!() == "Test");
238 }
239 
240 mixin template _contractm (alias Cond,alias Fnc=identity) 
241 {
242     mixin template _ (U...) 
243     if(Cond) 
244     {
245         alias _ = Fnc!U;
246     }
247 }
248 
249 mixin template _mcontractm(alias Cond,alias Fnc=_identity) {
250     mixin template _ (U...) 
251     if(Cond) 
252     {
253         mixin Fnc!U;
254     }
255 }
256 
257 template contract(alias Cond,alias Fnc=identity) 
258 if (Cond) 
259 {
260     alias contract = Fnc;
261 }
262 
263 mixin template _ncontractm(alias Cond,alias Fnc=identity) 
264 {
265     mixin template _ (U...) 
266     if(!Cond) 
267     {
268         alias _ = Fnc!U;
269     }
270 }
271 
272 template ncontract(alias Cond,alias Fnc=identity) 
273 if (!Cond) 
274 {
275     alias ncontract = Fnc;
276 }
277 
278 unittest {
279     static assert(!is(typeof(contract!(false,"Test"))));
280     static assert(is(typeof(contract!(true,"Test")) == string));
281     static assert(contract!(true,"Test")=="Test");
282 }
283 
284 unittest {
285     mixin _contractm!(true,identity) m;
286     //static assert(is(typeof(m._!(true))));
287     mixin m._!("Test") n;
288     static assert(n._ == "Test");
289 }
290 
291 unittest {
292     mixin _contractm!(false,identity) m;
293     //static assert(!is(typeof(m._!(true))));
294     //mixin m._!("Test") n;
295     //mixin m._!() n;
296     //assert(n._ == "Test");
297 }
298 
299 unittest {
300     mixin _contract!(false,"Test");
301     static assert(!is(typeof(_!())));
302 //    static assert(is(typeof(_) == void));
303 }
304 
305 unittest {
306     mixin _contract!(true,"Test");
307     static assert(_!() == "Test");
308 }
309 
310 unittest {
311     mixin _contract!(true,identity);
312     static assert(_!("Test") == "Test");
313 }
314 
315 unittest {
316     alias c = mixin_t!(_contract,true,identity);
317     //static assert(is(typeof(c._)));
318     mixin c._!("Test") d;
319     static assert(d._ == "Test");
320 
321     mixin _mixin_t!(_contract,true,identity) e;
322     mixin e._!("Test") f;
323     static assert(f._ == "Test");
324 
325     mixin _mixin_t!(_contract,false,identity) g;
326     static assert(is(typeof(g._) == void));
327 
328 }
329 
330 mixin template _import(string name,alias T=_identity,V...) {
331     mixin("import " ~ name ~ ";");
332     //enum toString = "import " ~ name ~ ";";
333     mixin T!V _;
334 }
335 
336 /*
337 mixin template _import(string name,tokens...) {
338     import std.array : join;
339     enum _tokens = tokens.join(",");
340     mixin("import " ~ name ~ ":" ~ _tokens ~ ";");
341     enum toString = "import " ~ name ~ " : " ~ _tokens ~ ";";
342 }*/
343 
344 template __importFile(string name) {
345     enum __importFile=import(name);
346 }
347 
348 mixin template _importFile(string name) {
349     enum _ = __importFile!(name);
350     enum toString = "importFile! (" ~ name ~ ")";
351 }
352 
353 mixin template _main(alias _body=_identity) {
354     auto main(string[] args) {
355         mixin _body;
356     }
357 }
358 
359