e7991adfaa
The base graph implementation has been moved into its own package, `graph`, and been made fully generic, ie the value on each vertex/edge is a parameterized type. This will allow us to use the graph for both syntax parsing (gg) and runtime evaluation (vm), with each use-case being able to use slightly different Value types.
81 lines
1.6 KiB
Go
81 lines
1.6 KiB
Go
// Package gg implements ginger graph creation, traversal, and (de)serialization
|
|
package gg
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/mediocregopher/ginger/graph"
|
|
)
|
|
|
|
// ZeroValue is a Value with no fields set.
|
|
var ZeroValue Value
|
|
|
|
// Value represents a value being stored in a Graph.
|
|
type Value struct {
|
|
|
|
// Only one of these fields may be set
|
|
Name *string
|
|
Number *int64
|
|
Graph *graph.Graph[Value]
|
|
|
|
// TODO coming soon!
|
|
// String *string
|
|
|
|
// Optional fields indicating the token which was used to construct this
|
|
// Value, if any.
|
|
LexerToken *LexerToken
|
|
}
|
|
|
|
// IsZero returns true if the Value is the zero value (none of the sub-value
|
|
// fields are set). LexerToken is ignored for this check.
|
|
func (v Value) IsZero() bool {
|
|
return v.Equal(ZeroValue)
|
|
}
|
|
|
|
// Equal returns true if the passed in Value is equivalent, ignoring the
|
|
// LexerToken on either Value.
|
|
//
|
|
// Will panic if the passed in v2 is not a Value from this package.
|
|
func (v Value) Equal(v2g graph.Value) bool {
|
|
|
|
v2 := v2g.(Value)
|
|
|
|
v.LexerToken, v2.LexerToken = nil, nil
|
|
|
|
switch {
|
|
|
|
case v == ZeroValue && v2 == ZeroValue:
|
|
return true
|
|
|
|
case v.Name != nil && v2.Name != nil && *v.Name == *v2.Name:
|
|
return true
|
|
|
|
case v.Number != nil && v2.Number != nil && *v.Number == *v2.Number:
|
|
return true
|
|
|
|
case v.Graph != nil && v2.Graph != nil && v.Graph.Equal(v2.Graph):
|
|
return true
|
|
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
func (v Value) String() string {
|
|
|
|
switch {
|
|
|
|
case v.Name != nil:
|
|
return *v.Name
|
|
|
|
case v.Number != nil:
|
|
return fmt.Sprint(*v.Number)
|
|
|
|
case v.Graph != nil:
|
|
return v.Graph.String()
|
|
|
|
default:
|
|
return "<zero>"
|
|
}
|
|
}
|