Skip to content

Commit

Permalink
core!: implement iterators
Browse files Browse the repository at this point in the history
  • Loading branch information
moisespsena committed Mar 5, 2024
1 parent 13baca1 commit 361fe2b
Show file tree
Hide file tree
Showing 46 changed files with 2,077 additions and 1,121 deletions.
47 changes: 7 additions & 40 deletions builtin_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ func (b *BuiltinObjType) String() string {

var (
TNil,
TItEntry,
TFlag,
TBool,
TInt,
Expand Down Expand Up @@ -133,9 +134,10 @@ var (
)

func init() {
TNil = RegisterBuiltinType(BuiltinNil, "nil", Nil, func(call Call) (ret Object, err error) {
return Nil, nil
})
TNil = RegisterBuiltinType(BuiltinNil, "nil", Nil, nil)
TItEntry = RegisterBuiltinType(BuiltinItEntry, "ItEntry", Nil, funcPOOROe(func(k Object, v Object) (Object, error) {
return &IteratorEntry{KeyValue{K: k, V: v}}, nil
}))
TFlag = RegisterBuiltinType(BuiltinFlag, "flag", Yes, funcPORO(BuiltinFlagFunc))
TBool = RegisterBuiltinType(BuiltinBool, "bool", True, funcPORO(BuiltinBoolFunc))
TInt = RegisterBuiltinType(BuiltinInt, "int", Int(0), funcPi64RO(BuiltinIntFunc))
Expand All @@ -150,43 +152,8 @@ func init() {
TArray = RegisterBuiltinType(BuiltinArray, "array", Array{}, func(c Call) (ret Object, err error) {
return c.Args.Values(), nil
})
TDict = RegisterBuiltinType(BuiltinDict, "dict", Dict{}, func(c Call) (ret Object, err error) {
d := Dict{}
c.Args.Walk(func(_ int, arg Object) any {
switch t := arg.(type) {
case KeyValueArray:
var v Object
for _, value := range t {
v = value.V
if v != No {
d[value.K.ToString()] = v
}
}
default:
if Iterable(arg) {
it := arg.(Iterabler).Iterate(c.VM)
for it.Next() {
if d[it.Key().ToString()], err = it.Value(); err != nil {
return err
}
}
}
}
return nil
})
if err != nil {
return
}
if len(d) == 0 {
d = c.NamedArgs.AllDict()
} else {
for k, v := range c.NamedArgs.AllDict() {
d[k] = v
}
}
return d, nil
})
TSyncDict = RegisterBuiltinType(BuiltinSyncDic, "syncDict", SyncMap{}, BuiltinSyncDictFunc)
TDict = RegisterBuiltinType(BuiltinDict, "dict", Dict{}, BuiltinDictFunc)
TSyncDict = RegisterBuiltinType(BuiltinSyncDic, "syncDict", SyncDict{}, BuiltinSyncDictFunc)
TKeyValue = RegisterBuiltinType(BuiltinKeyValue, "keyValue", KeyValue{}, BuiltinKeyValueFunc)
TKeyValueArray = RegisterBuiltinType(BuiltinKeyValueArray, "keyValueArray", KeyValueArray{}, BuiltinKeyValueArrayFunc)
TError = RegisterBuiltinType(BuiltinError, "error", Error{}, funcPORO(BuiltinErrorFunc))
Expand Down
61 changes: 48 additions & 13 deletions builtins.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@

package gad

import "sync"
import (
"sync"
)

//go:generate go run ./cmd/mkcallable -output builtins_zfuncs.go builtins.go

Expand Down Expand Up @@ -37,6 +39,8 @@ const (
BuiltinKeyValueArray
BuiltinError
BuiltinBuffer
BuiltinIterator
BuiltinItEntry
BuiltinTypesEnd_

BuiltinFunctionsBegin_
Expand Down Expand Up @@ -73,9 +77,12 @@ const (
BuiltinRawCaller
BuiltinMakeArray
BuiltinCap
BuiltinIterate
BuiltinKeys
BuiltinValues
BuiltinItems
BuiltinCollect
BuiltinIteratorInput
BuiltinVMPushWriter
BuiltinVMPopWriter
BuiltinOBStart
Expand All @@ -100,6 +107,7 @@ const (
BuiltinIsFunction
BuiltinIsCallable
BuiltinIsIterable
BuiltinIsIterator

BuiltinFunctionsEnd_
BuiltinErrorsBegin_
Expand Down Expand Up @@ -207,6 +215,7 @@ var BuiltinsMap = map[string]BuiltinType{
"isFunction": BuiltinIsFunction,
"isCallable": BuiltinIsCallable,
"isIterable": BuiltinIsIterable,
"isIterator": BuiltinIsIterator,

"WrongNumArgumentsError": BuiltinWrongNumArgumentsError,
"InvalidOperatorError": BuiltinInvalidOperatorError,
Expand All @@ -222,9 +231,13 @@ var BuiltinsMap = map[string]BuiltinType{
":makeArray": BuiltinMakeArray,
"cap": BuiltinCap,

"iterate": BuiltinIterate,
"keys": BuiltinKeys,
"values": BuiltinValues,
"items": BuiltinItems,
"collect": BuiltinCollect,
"iterator": BuiltinIterator,
"iteratorInput": BuiltinIteratorInput,
"keyValue": BuiltinKeyValue,
"keyValueArray": BuiltinKeyValueArray,

Expand Down Expand Up @@ -510,19 +523,11 @@ var BuiltinObjects = BuiltinObjectsMap{
},
BuiltinIsIterable: &BuiltinFunction{
Name: "isIterable",
Value: funcPORO(BuiltinIsIterableFunc),
},
BuiltinKeys: &BuiltinFunction{
Name: "keys",
Value: BuiltinKeysFunc,
},
BuiltinValues: &BuiltinFunction{
Name: "values",
Value: BuiltinValuesFunc,
Value: funcPpVM_ORO(BuiltinIsIterableFunc),
},
BuiltinItems: &BuiltinFunction{
Name: "items",
Value: BuiltinItemsFunc,
BuiltinIsIterator: &BuiltinFunction{
Name: "isIterator",
Value: funcPORO(BuiltinIsIteratorFunc),
},
BuiltinStdIO: &BuiltinFunction{
Name: "stdio",
Expand Down Expand Up @@ -623,6 +628,32 @@ func init() {
Name: "each",
Value: BuiltinEachFunc,
}

BuiltinObjects[BuiltinIterate] = &BuiltinFunction{
Name: "iterate",
Value: BuiltinIterateFunc,
}
BuiltinObjects[BuiltinKeys] = &BuiltinFunction{
Name: "keys",
Value: BuiltinKeysFunc,
}
BuiltinObjects[BuiltinValues] = &BuiltinFunction{
Name: "values",
Value: BuiltinValuesFunc,
}
BuiltinObjects[BuiltinItems] = &BuiltinFunction{
Name: "items",
Value: BuiltinItemsFunc,
}
BuiltinObjects[BuiltinCollect] = &BuiltinFunction{
Name: "collect",
Value: BuiltinCollectFunc,
}
BuiltinObjects[BuiltinIterator] = TIterator
BuiltinObjects[BuiltinIteratorInput] = &BuiltinFunction{
Name: "iteratorInput",
Value: funcPORO(BuiltinIteratorInputFunc),
}
}

// functions to generate with mkcallable
Expand Down Expand Up @@ -680,3 +711,7 @@ func init() {
// builtin decimal
//
//gad:callable func(vm *VM, v Object) (ret Object, err error)

// builtin isIterable
//
//gad:callable func(vm *VM, v Object) (ret Object)
Loading

0 comments on commit 361fe2b

Please sign in to comment.