@@ -2,6 +2,7 @@ package runtime
2
2
3
3
import (
4
4
"fmt"
5
+ "sort"
5
6
"strings"
6
7
)
7
8
@@ -105,7 +106,8 @@ func (rv PreludeDict) Lookup(member string) (Evaluatable, *RuntimeError) {
105
106
})), nil
106
107
case "entries" :
107
108
pairs := make ([]RuntimeValue , 0 , len (rv .dict ))
108
- for k , v := range rv .dict {
109
+ for _ , k := range rv .orderedKeys () {
110
+ v := rv .dict [k ]
109
111
pair , err := rv .context .environment .MakePair (NewConstantRuntimeValue (k ), v )
110
112
if err != nil {
111
113
return nil , err
@@ -116,15 +118,15 @@ func (rv PreludeDict) Lookup(member string) (Evaluatable, *RuntimeError) {
116
118
return NewConstantRuntimeValue (dataList ), err
117
119
case "keys" :
118
120
keys := make ([]RuntimeValue , 0 , len (rv .dict ))
119
- for k := range rv .dict {
121
+ for _ , k := range rv .orderedKeys () {
120
122
keys = append (keys , k )
121
123
}
122
124
dataList , err := rv .context .environment .MakeEagerList (keys )
123
125
return NewConstantRuntimeValue (dataList ), err
124
126
case "values" :
125
127
values := make ([]Evaluatable , 0 , len (rv .dict ))
126
- for _ , v := range rv .dict {
127
- values = append (values , v )
128
+ for _ , k := range rv .orderedKeys () {
129
+ values = append (values , rv . dict [ k ] )
128
130
}
129
131
dataList , err := rv .context .environment .MakeList (values )
130
132
return NewConstantRuntimeValue (dataList ), err
@@ -136,3 +138,18 @@ func (rv PreludeDict) Lookup(member string) (Evaluatable, *RuntimeError) {
136
138
func (rv PreludeDict ) copy () PreludeDict {
137
139
return MakePreludeDict (rv .context , rv .dict )
138
140
}
141
+
142
+ func (rv PreludeDict ) orderedKeys () []PreludeString {
143
+ keys := make ([]PreludeString , 0 , len (rv .dict ))
144
+ for k := range rv .dict {
145
+ keys = append (keys , k )
146
+ }
147
+ sort .Sort (preludeStringSlice (keys ))
148
+ return keys
149
+ }
150
+
151
+ type preludeStringSlice []PreludeString
152
+
153
+ func (x preludeStringSlice ) Len () int { return len (x ) }
154
+ func (x preludeStringSlice ) Less (i , j int ) bool { return x [i ] < x [j ] }
155
+ func (x preludeStringSlice ) Swap (i , j int ) { x [i ], x [j ] = x [j ], x [i ] }
0 commit comments