1 module orelang.operator.HashMapOperators;
2 import orelang.operator.IOperator,
3        orelang.Engine,
4        orelang.Value;
5 
6 class MakeHashOperator : IOperator {
7   /**
8    * call
9    */
10   /*
11     (make-hash name)
12    */
13   public Value call(Engine engine, Value[] args) {
14     string name = args[0].getString;
15     Value[string] hash = null;
16     Value ret = new Value(hash);
17 
18     engine.defineVariable(name, ret);
19 
20     return ret;
21   }
22 }
23 
24 class NewHashOperator : IOperator {
25   /**
26    * call
27    */
28   /*
29     (new-hash)
30    */
31   public Value call(Engine engine, Value[] args) {
32     Value[string] hash = null;
33     Value ret = new Value(hash);
34 
35     return ret;
36   }
37 }
38 
39 class HashSetValueOperator : IOperator {
40   /**
41    * call
42    */
43   /*
44     (hash-set-value hash key value)
45   */
46   public Value call(Engine engine, Value[] args) {
47     Value ret;
48 
49     if (args[0].type == ValueType.SymbolValue) {
50       Value obj = engine.getVariable(args[0].getString);
51 
52       if (obj.type == ValueType.HashMap) {
53         Value[string] hash = obj.getHashMap;
54         
55         hash[engine.eval(args[1]).getString] = engine.eval(args[2]);
56         ret = new Value(hash);
57       
58         engine.setVariable(args[0].getString, ret);
59       } else {
60         throw new Exception("No such a HashMap - " ~ args[0].getString);
61       }
62     } else if (args[0].type == ValueType.HashMap) {
63       Value[string] hash = args[0].getHashMap;
64 
65       hash[engine.eval(args[1]).getString] = engine.eval(args[2]);
66       ret = new Value(hash);
67 
68       engine.setVariable(args[0].getString, ret);
69     } else {
70       throw new Exception("set-value accepts (HashName Key Value) or (HashValue Key Value) only");
71     }
72 
73     return ret;
74   }
75 }
76 
77 class HashGetValueOperator : IOperator {
78   /**
79    * call
80    */
81   /*
82     (hash-get-value hash key)
83   */
84   public Value call(Engine engine, Value[] args) {
85     if (args[0].type == ValueType.SymbolValue) {
86       Value obj = engine.getVariable(args[0].getString);
87 
88       if (obj.type == ValueType.HashMap) {
89         Value[string] hash = obj.getHashMap;
90         return hash[engine.eval(args[1]).getString];
91       } else {
92         throw new Exception("No such a HashMap - " ~ args[0].getString);
93       }
94     } else if (engine.eval(args[0]).type == ValueType.HashMap) {
95       Value[string] hash = engine.eval(args[0]).getHashMap;
96 
97       return hash[engine.eval(args[1]).getString];
98     } else {
99       throw new Exception("hash-get-value accepts (HashName Key Value) or (HashValue Key Value) only");
100     }
101   }
102 }
103 
104 class HashGetKeysOperator : IOperator {
105   /**
106    * call
107    */
108   /*
109     (hash-get-keys hash)
110   */
111   public Value call(Engine engine, Value[] args) {
112     if (args[0].type == ValueType.SymbolValue) {
113       Value obj = engine.getVariable(args[0].getString);
114 
115       if (obj.type == ValueType.HashMap) {
116         Value[string] hash = obj.getHashMap;
117         Value[] keys;
118 
119         foreach (key; hash.keys) {
120           keys ~= new Value(key);
121         }
122 
123         return new Value(keys);
124       } else {
125         throw new Exception("No such a HashMap - " ~ args[0].getString);
126       }
127     } else if (engine.eval(args[0]).type == ValueType.HashMap) {
128       Value[string] hash = engine.eval(args[0]).getHashMap;
129       Value[] keys;
130 
131       foreach (key; hash.keys) {
132         keys ~= new Value(key);
133       }
134 
135       return new Value(keys);
136     } else {
137       throw new Exception("hash-get-keys accepts (HashName Key Value) or (HashValue Key Value) only");
138     }
139   }
140 }
141 
142 class HashGetValuesOperator : IOperator {
143   /**
144    * call
145    */
146   /*
147     (hash-get-values hash)
148   */
149   public Value call(Engine engine, Value[] args) {
150     if (args[0].type == ValueType.SymbolValue) {
151       Value obj = engine.getVariable(args[0].getString);
152 
153       if (obj.type == ValueType.HashMap) {
154         Value[string] hash = obj.getHashMap;
155         Value[] values;
156 
157         foreach (value; hash.values) {
158           values ~= value;
159         }
160 
161         return new Value(values);
162       } else {
163         throw new Exception("No such a HashMap - " ~ args[0].getString);
164       }
165     } else if (engine.eval(args[0]).type == ValueType.HashMap) {
166       Value[string] hash = engine.eval(args[0]).getHashMap;
167       Value[] values;
168 
169       foreach (value; hash.values) {
170         values ~= value;
171       }
172 
173       return new Value(values);
174     } else {
175       throw new Exception("hash-get-values accepts (HashName Key Value) or (HashValue Key Value) only");
176     }
177   }
178 }