1 /***********************************************************************************************
2 *	Copyright: © 2017-2021 UI Manufaktur UG
3 *	License: Subject to the terms of the MIT license, as written in the included LICENSE.txt file.
4 *	Authors: UI Manufaktur Team
5 *	Documentation [DE]: https://ui-manufaktur.com/docu/uim-core/containers/stringaa
6 ************************************************************************************************/
7 module uim.core.containers.stringaa;
8 
9 @safe:
10 import std.algorithm : startsWith, endsWith; 
11 import uim.core; 
12 
13 alias StringAA = string[string];
14 
15 	StringAA addKeyPrefix(StringAA entries, string prefix) {
16 		StringAA results;
17 		foreach(k, v; entries) results[prefix~k] = v;
18 		return results;
19 	}
20 	unittest {
21 		/// TODO
22 	}
23 
24 	/// Selects only entries, where key starts with prefix. Creates a new StringAA
25 	@safe StringAA selectStartsWith(StringAA entries, string prefix) {  
26 		StringAA results;
27 		foreach(k, v; entries) if (k.startsWith(prefix)) results[k] = v;
28 		return results;
29 	}
30 	unittest {
31 		assert(selectStartsWith(["preA":"a", "b":"b"], "pre") == ["preA":"a"]);
32 		assert(["preA":"a", "b":"b"].selectStartsWith("pre") == ["preA":"a"]);
33 	}
34 
35 	/// Opposite of selectStartsWith: Selects only entries, where key starts not with prefix. Creates a new StringAA
36 	StringAA selectsStartsNotWith(StringAA entries, string prefix) {  // right will overright left
37 		StringAA results;
38 		foreach(k, v; entries) if (!k.startsWith(prefix)) results[k] = v;
39 		return results;
40 	}
41 	unittest {
42 		assert(selectsStartsNotWith(["preA":"a", "b":"b"], "pre") == ["b":"b"]);
43 		assert(["preA":"a", "b":"b"].selectsStartsNotWith("pre") == ["b":"b"]);
44 	}
45 
46 	StringAA endsWith(StringAA entries, string postfix) {  // right will overright left
47 		StringAA results;
48 		foreach(k, v; entries) if (k.endsWith(postfix)) results[k] = v;
49 		return results;
50 	}
51 	unittest {
52 		/// TODO
53 	}
54 
55 	StringAA endsNotWith(StringAA entries, string postfix) {  // right will overright left
56 		StringAA results;
57 		foreach(k, v; entries) if (!k.endsWith(postfix)) results[k] = v;
58 		return results;
59 	}
60 	unittest {
61 		/// TODO
62 	}
63 
64 	StringAA selectKeys(StringAA entries, string[] keys) {
65 		StringAA results;
66 		foreach(k; keys) if (k in entries) results[k] = entries[k];
67 		return results;
68 	}
69 	unittest {
70 		/// TODO
71 	}
72 
73 	StringAA selectNotKeys(StringAA entries, string[] keys) {
74 		StringAA results = entries.dup;
75 		foreach(k; keys) if (k in entries) results.remove(k);
76 		return results;
77 	}
78 	unittest {
79 		/// TODO
80 	}
81 
82 	StringAA selectValues(StringAA entries, string[] values) {
83 		StringAA results;
84 		foreach(val; values) {
85 			foreach(k, v; entries) {
86 				if (v == val) results[k] = entries[k];
87 			}
88 		}
89 		return results;
90 	}
91 	unittest {
92 		/// TODO
93 	}
94 
95 	string toString(string[string] aa) {
96 		import std..string; 
97 		return "%s".format(aa);
98 	}
99 
100 	string aa2String(STRINGAA atts, string sep = "=") {
101 		string[] strings;
102 		foreach(k, v; atts) strings ~= k~sep~"\""~v~"\"";
103 		return strings.join(" ");
104 	}
105 	unittest {
106 		/// TODO
107 	}
108 
109 	string getValue(STRINGAA keyValues, string[] keys...) {
110 		foreach(k; keys) if (k in keyValues) return keyValues[k];
111 		return null;
112 	}
113