Skip to content

Commit

Permalink
Merge pull request #515 from dorian3343/main
Browse files Browse the repository at this point in the history
Added list length component
  • Loading branch information
emil14 committed Mar 13, 2024
2 parents de70d7d + 86625e4 commit 162d058
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 4 deletions.
20 changes: 20 additions & 0 deletions e2e/run_examples_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,23 @@ func TestEcho(t *testing.T) {

require.Equal(t, 0, cmd.ProcessState.ExitCode())
}

func TestLength(t *testing.T) {
err := os.Chdir("../examples")
require.NoError(t, err)

defer os.Chdir(wd)

cmd := exec.Command("neva", "run", "13_list_length")

out, err := cmd.CombinedOutput()
require.NoError(t, err)

require.Equal(
t,
"5\n",
string(out),
)

require.Equal(t, 0, cmd.ProcessState.ExitCode())
}
12 changes: 12 additions & 0 deletions examples/13_list_length/main.neva
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
const n list<int> = [4,123,22,1121,215]
component Main(start any) (stop any) {
nodes {
printer Printer<any>
len Len<list<int>>
}
net {
:start -> ($n -> len:data)
len:res -> printer:data
printer:sig -> :stop
}
}
35 changes: 35 additions & 0 deletions internal/runtime/funcs/length.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package funcs

import (
"context"
"github.com/nevalang/neva/internal/runtime"
)

type listlen struct{}

func (p listlen) Create(io runtime.FuncIO, _ runtime.Msg) (func(ctx context.Context), error) {
dataIn, err := io.In.Port("data")
if err != nil {
return nil, err
}

resOut, err := io.Out.Port("res")
if err != nil {
return nil, err
}

return func(ctx context.Context) {
for {
select {
case <-ctx.Done():
return
case data := <-dataIn:
select {
case <-ctx.Done():
return
case resOut <- runtime.NewIntMsg(int64(len(data.List()))):
}
}
}
}, nil
}
8 changes: 5 additions & 3 deletions internal/runtime/funcs/registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ func CreatorRegistry() map[string]runtime.FuncCreator {
// logic
"int_eq": intEq{},
// math
"int_adder": intAdder{},
"int_subtractor": intSubtractor{},
"int_multiplier": intMultiplier{},
"int_adder": intAdder{},
"int_subtractor": intSubtractor{},
"int_multiplier": intMultiplier{},
"int_decrementor": intDecrementor{},
// io
"line_scanner": lineScanner{},
Expand All @@ -31,5 +31,7 @@ func CreatorRegistry() map[string]runtime.FuncCreator {
"int_parser": intParser{},
// regexp
"regexp_submatcher": regexpSubmatcher{},
//list
"list_len": listlen{},
}
}
9 changes: 8 additions & 1 deletion std/builtin/base.neva
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,11 @@ type EqElse<T any> struct {
}

#extern(int int_eq, float float_eq, string string_eq)
pub component Eq<T int |float | string>(a T, b T) (then T, else EqElse<T>)
pub component Eq<T int |float | string>(a T, b T) (then T, else EqElse<T>)

// List / Map operations
#extern(list list_len, map map_len)
pub component Len<T list<any> | map<any>>(data T) (res int)



0 comments on commit 162d058

Please sign in to comment.