Skip to content

Commit 4f3c2d6

Browse files
committed
extract runtime value type formatting helpers
1 parent 423011b commit 4f3c2d6

3 files changed

Lines changed: 131 additions & 122 deletions

File tree

docs/architecture.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ Key files:
4444
- `vibes/execution_members_array_query.go` (array query/enumeration member methods)
4545
- `vibes/execution_members_array_transforms.go` (array mutation/transform member methods)
4646
- `vibes/execution_members_array_grouping.go` (array sort/group/tally member methods)
47-
- `vibes/execution_types.go` (type-checking + type formatting helpers)
47+
- `vibes/execution_types.go` (type-checking and declared-type formatting helpers)
48+
- `vibes/execution_types_value_format.go` (runtime value-type formatting helpers)
4849
- `vibes/execution_values.go` (value conversion, sorting, and flattening helpers)
4950
- `vibes/execution_values_arithmetic.go` (value arithmetic and comparison operators)
5051

vibes/execution_types.go

Lines changed: 0 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -298,124 +298,3 @@ func formatShapeType(ty *TypeExpr) string {
298298
}
299299
return "{ " + strings.Join(parts, ", ") + " }"
300300
}
301-
302-
func formatValueTypeExpr(val Value) string {
303-
state := valueTypeFormatState{
304-
seenArrays: make(map[uintptr]struct{}),
305-
seenHashes: make(map[uintptr]struct{}),
306-
}
307-
return state.format(val)
308-
}
309-
310-
type valueTypeFormatState struct {
311-
seenArrays map[uintptr]struct{}
312-
seenHashes map[uintptr]struct{}
313-
}
314-
315-
func (s *valueTypeFormatState) format(val Value) string {
316-
switch val.Kind() {
317-
case KindNil:
318-
return "nil"
319-
case KindBool:
320-
return "bool"
321-
case KindInt:
322-
return "int"
323-
case KindFloat:
324-
return "float"
325-
case KindString:
326-
return "string"
327-
case KindMoney:
328-
return "money"
329-
case KindDuration:
330-
return "duration"
331-
case KindTime:
332-
return "time"
333-
case KindSymbol:
334-
return "symbol"
335-
case KindRange:
336-
return "range"
337-
case KindFunction:
338-
return "function"
339-
case KindBuiltin:
340-
return "builtin"
341-
case KindBlock:
342-
return "block"
343-
case KindClass:
344-
return "class"
345-
case KindInstance:
346-
return "instance"
347-
case KindArray:
348-
return s.formatArray(val.Array())
349-
case KindHash, KindObject:
350-
return s.formatHash(val.Hash())
351-
default:
352-
return val.Kind().String()
353-
}
354-
}
355-
356-
func (s *valueTypeFormatState) formatArray(values []Value) string {
357-
if len(values) == 0 {
358-
return "array<empty>"
359-
}
360-
361-
id := reflect.ValueOf(values).Pointer()
362-
if id != 0 {
363-
if _, seen := s.seenArrays[id]; seen {
364-
return "array<...>"
365-
}
366-
s.seenArrays[id] = struct{}{}
367-
defer delete(s.seenArrays, id)
368-
}
369-
370-
elementTypes := make(map[string]struct{}, len(values))
371-
for _, value := range values {
372-
elementTypes[s.format(value)] = struct{}{}
373-
}
374-
return "array<" + joinSortedTypes(elementTypes) + ">"
375-
}
376-
377-
func (s *valueTypeFormatState) formatHash(values map[string]Value) string {
378-
if len(values) == 0 {
379-
return "{}"
380-
}
381-
382-
id := reflect.ValueOf(values).Pointer()
383-
if id != 0 {
384-
if _, seen := s.seenHashes[id]; seen {
385-
return "{ ... }"
386-
}
387-
s.seenHashes[id] = struct{}{}
388-
defer delete(s.seenHashes, id)
389-
}
390-
391-
if len(values) <= 6 {
392-
fields := make([]string, 0, len(values))
393-
for field := range values {
394-
fields = append(fields, field)
395-
}
396-
sort.Strings(fields)
397-
parts := make([]string, len(fields))
398-
for i, field := range fields {
399-
parts[i] = fmt.Sprintf("%s: %s", field, s.format(values[field]))
400-
}
401-
return "{ " + strings.Join(parts, ", ") + " }"
402-
}
403-
404-
valueTypes := make(map[string]struct{}, len(values))
405-
for _, value := range values {
406-
valueTypes[s.format(value)] = struct{}{}
407-
}
408-
return "hash<string, " + joinSortedTypes(valueTypes) + ">"
409-
}
410-
411-
func joinSortedTypes(typeSet map[string]struct{}) string {
412-
if len(typeSet) == 0 {
413-
return "empty"
414-
}
415-
parts := make([]string, 0, len(typeSet))
416-
for typeName := range typeSet {
417-
parts = append(parts, typeName)
418-
}
419-
sort.Strings(parts)
420-
return strings.Join(parts, " | ")
421-
}
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package vibes
2+
3+
import (
4+
"fmt"
5+
"reflect"
6+
"sort"
7+
"strings"
8+
)
9+
10+
func formatValueTypeExpr(val Value) string {
11+
state := valueTypeFormatState{
12+
seenArrays: make(map[uintptr]struct{}),
13+
seenHashes: make(map[uintptr]struct{}),
14+
}
15+
return state.format(val)
16+
}
17+
18+
type valueTypeFormatState struct {
19+
seenArrays map[uintptr]struct{}
20+
seenHashes map[uintptr]struct{}
21+
}
22+
23+
func (s *valueTypeFormatState) format(val Value) string {
24+
switch val.Kind() {
25+
case KindNil:
26+
return "nil"
27+
case KindBool:
28+
return "bool"
29+
case KindInt:
30+
return "int"
31+
case KindFloat:
32+
return "float"
33+
case KindString:
34+
return "string"
35+
case KindMoney:
36+
return "money"
37+
case KindDuration:
38+
return "duration"
39+
case KindTime:
40+
return "time"
41+
case KindSymbol:
42+
return "symbol"
43+
case KindRange:
44+
return "range"
45+
case KindFunction:
46+
return "function"
47+
case KindBuiltin:
48+
return "builtin"
49+
case KindBlock:
50+
return "block"
51+
case KindClass:
52+
return "class"
53+
case KindInstance:
54+
return "instance"
55+
case KindArray:
56+
return s.formatArray(val.Array())
57+
case KindHash, KindObject:
58+
return s.formatHash(val.Hash())
59+
default:
60+
return val.Kind().String()
61+
}
62+
}
63+
64+
func (s *valueTypeFormatState) formatArray(values []Value) string {
65+
if len(values) == 0 {
66+
return "array<empty>"
67+
}
68+
69+
id := reflect.ValueOf(values).Pointer()
70+
if id != 0 {
71+
if _, seen := s.seenArrays[id]; seen {
72+
return "array<...>"
73+
}
74+
s.seenArrays[id] = struct{}{}
75+
defer delete(s.seenArrays, id)
76+
}
77+
78+
elementTypes := make(map[string]struct{}, len(values))
79+
for _, value := range values {
80+
elementTypes[s.format(value)] = struct{}{}
81+
}
82+
return "array<" + joinSortedTypes(elementTypes) + ">"
83+
}
84+
85+
func (s *valueTypeFormatState) formatHash(values map[string]Value) string {
86+
if len(values) == 0 {
87+
return "{}"
88+
}
89+
90+
id := reflect.ValueOf(values).Pointer()
91+
if id != 0 {
92+
if _, seen := s.seenHashes[id]; seen {
93+
return "{ ... }"
94+
}
95+
s.seenHashes[id] = struct{}{}
96+
defer delete(s.seenHashes, id)
97+
}
98+
99+
if len(values) <= 6 {
100+
fields := make([]string, 0, len(values))
101+
for field := range values {
102+
fields = append(fields, field)
103+
}
104+
sort.Strings(fields)
105+
parts := make([]string, len(fields))
106+
for i, field := range fields {
107+
parts[i] = fmt.Sprintf("%s: %s", field, s.format(values[field]))
108+
}
109+
return "{ " + strings.Join(parts, ", ") + " }"
110+
}
111+
112+
valueTypes := make(map[string]struct{}, len(values))
113+
for _, value := range values {
114+
valueTypes[s.format(value)] = struct{}{}
115+
}
116+
return "hash<string, " + joinSortedTypes(valueTypes) + ">"
117+
}
118+
119+
func joinSortedTypes(typeSet map[string]struct{}) string {
120+
if len(typeSet) == 0 {
121+
return "empty"
122+
}
123+
parts := make([]string, 0, len(typeSet))
124+
for typeName := range typeSet {
125+
parts = append(parts, typeName)
126+
}
127+
sort.Strings(parts)
128+
return strings.Join(parts, " | ")
129+
}

0 commit comments

Comments
 (0)