Skip to content

Commit 78640d5

Browse files
committed
OO Map
1 parent 1c550c1 commit 78640d5

File tree

2 files changed

+140
-0
lines changed

2 files changed

+140
-0
lines changed

ImportAll.mo

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import _pureMap "src/pure/Map";
4545
import _pureQueue "src/pure/Queue";
4646
import _pureRealTimeQueue "src/pure/RealTimeQueue";
4747
import _pureSet "src/pure/Set";
48+
import _ooMap "src/object-oriented/Map";
4849

4950
persistent actor {
5051

src/object-oriented/Map.mo

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
import Order "../Order";
2+
import Iter "../Iter";
3+
import ImperativeMap "../Map";
4+
import PureMap "../pure/Map";
5+
import Runtime "../Runtime";
6+
7+
module {
8+
type PersistentCompare<K> = stable (K, K) -> Order.Order;
9+
type TransientCompare<K> = (K, K) -> Order.Order;
10+
11+
public class Map<K, V>(comparison : PersistentCompare<K>) {
12+
let inner = ImperativeMap.empty<K, V>();
13+
14+
public func toPure() : PureMap.Map<K, V> {
15+
PureMap.fromIter(ImperativeMap.entries(inner), comparison : TransientCompare<K>)
16+
};
17+
18+
public func toImperative() : ImperativeMap.Map<K, V> {
19+
ImperativeMap.clone(inner)
20+
};
21+
22+
public func isEmpty() : Bool {
23+
ImperativeMap.isEmpty(inner)
24+
};
25+
26+
public func size() : Nat {
27+
ImperativeMap.size(inner)
28+
};
29+
30+
public func add(key : K, value : V) {
31+
ImperativeMap.add(inner, comparison : TransientCompare<K>, key, value)
32+
};
33+
34+
public func containsKey(key : K) : Bool {
35+
ImperativeMap.containsKey(inner, comparison : TransientCompare<K>, key)
36+
};
37+
38+
public func get(key : K) : ?V {
39+
ImperativeMap.get(inner, comparison : TransientCompare<K>, key)
40+
};
41+
42+
public func remove(key : K) {
43+
ImperativeMap.remove(inner, comparison : TransientCompare<K>, key)
44+
};
45+
46+
public func clone() : Map<K, V> {
47+
fromImperative(inner, comparison)
48+
};
49+
50+
public func clear() {
51+
ImperativeMap.clear(inner)
52+
};
53+
54+
public func equal(other : Map<K, V>, equalValue : (V, V) -> Bool) : Bool {
55+
ImperativeMap.equal<K, V>(inner, other.internal(), comparison : TransientCompare<K>, equalValue)
56+
};
57+
58+
public func compare(other : Map<K, V>, compareValue : (V, V) -> Order.Order) : Order.Order {
59+
ImperativeMap.compare(inner, other.internal(), comparison : TransientCompare<K>, compareValue)
60+
};
61+
62+
public func maxEntry() : ?(K, V) {
63+
ImperativeMap.maxEntry(inner)
64+
};
65+
66+
public func minEntry() : ?(K, V) {
67+
ImperativeMap.minEntry(inner)
68+
};
69+
70+
public func entries() : Iter.Iter<(K, V)> {
71+
ImperativeMap.entries(inner)
72+
};
73+
74+
public func reverseEntries() : Iter.Iter<(K, V)> {
75+
ImperativeMap.reverseEntries(inner)
76+
};
77+
78+
public func keys() : Iter.Iter<K> {
79+
ImperativeMap.keys(inner)
80+
};
81+
82+
public func values() : Iter.Iter<V> {
83+
ImperativeMap.values(inner)
84+
};
85+
86+
public func forEach(operation : (K, V) -> ()) {
87+
for (entry in entries()) {
88+
operation(entry)
89+
}
90+
};
91+
92+
public func filter(criterion : (K, V) -> Bool) : Map<K, V> {
93+
fromImperative(ImperativeMap.filter(inner, comparison : TransientCompare<K>, criterion), comparison)
94+
};
95+
96+
// type error [M0200], cannot decide type constructor equality
97+
// public func map<R>(project : (K, V) -> R) : Map<K, R> {
98+
// fromImperative<K, R>(ImperativeMap.map<K, V, R>(inner, project), compare)
99+
// };
100+
101+
public func all(predicate : (K, V) -> Bool) : Bool {
102+
ImperativeMap.all(inner, predicate)
103+
};
104+
105+
public func any(predicate : (K, V) -> Bool) : Bool {
106+
ImperativeMap.any(inner, predicate)
107+
};
108+
109+
public func toText(keyFormat : K -> Text, valueFormat : V -> Text) : Text {
110+
ImperativeMap.toText(inner, keyFormat, valueFormat)
111+
};
112+
113+
public func internal() : ImperativeMap.Map<K, V> {
114+
inner
115+
}
116+
};
117+
118+
public func fromImperative<K, V>(map : ImperativeMap.Map<K, V>, compare : PersistentCompare<K>) : Map<K, V> {
119+
fromIter(ImperativeMap.entries(map), compare)
120+
};
121+
122+
public func fromIter<K, V>(iter : Iter.Iter<(K, V)>, compare : PersistentCompare<K>) : Map<K, V> {
123+
let result = Map<K, V>(compare);
124+
for ((key, value) in iter) {
125+
result.add(key, value)
126+
};
127+
result
128+
};
129+
130+
public func empty<K, V>(compare : PersistentCompare<K>) : Map<K, V> {
131+
Map<K, V>(compare)
132+
};
133+
134+
public func singleton<K, V>(compare : PersistentCompare<K>, key : K, value : V) : Map<K, V> {
135+
let result = Map<K, V>(compare);
136+
result.add(key, value);
137+
result
138+
}
139+
}

0 commit comments

Comments
 (0)