Skip to content

Commit

Permalink
std/stream: Add skip and change new. (#194)
Browse files Browse the repository at this point in the history
* wdte: Add error unwrapping.

* std/stream: Add `skip`.

* std/stream: Make `new` returns the initial value.
  • Loading branch information
DeedleFake authored Feb 13, 2020
1 parent 4e6feca commit 1064790
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 7 deletions.
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,5 @@ require (
golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb // indirect
)

go 1.13
37 changes: 37 additions & 0 deletions std/stream/middle.go
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,43 @@ func Limit(frame wdte.Frame, args ...wdte.Func) wdte.Func {
})
}

// Skip is a WDTE function with the following signature:
//
// (skip n) s
//
// Skip returns a Stream that skips the first n elements of s. In
// other wotds, the first element of the returned stream will be
// element n+1 of s.
func Skip(frame wdte.Frame, args ...wdte.Func) wdte.Func {
frame = frame.Sub("skip")

if len(args) == 0 {
return wdte.GoFunc(Skip)
}

n := args[0].Call(frame).(wdte.Number)

return wdte.GoFunc(func(frame wdte.Frame, args ...wdte.Func) wdte.Func {
frame = frame.Sub("skip")

s := args[0].Call(frame).(Stream)

return NextFunc(func(frame wdte.Frame) (wdte.Func, bool) {
frame = frame.Sub("skip")

for n > 0 {
next, ok := s.Next(frame)
if !ok {
return next, ok
}
n--
}

return s.Next(frame)
})
})
}

// Zip is a WDTE function with the following signatures:
//
// (zip s1) ...
Expand Down
11 changes: 5 additions & 6 deletions std/stream/start.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ import (
//
// It returns a new Stream that calls next in order to get the next
// element in the stream, passing it first initial and then the
// previous value on each call. The Stream ends when next returns end.
// previous value on each call. The Stream yields initial before it
// begins yielding the values returned from next. The Stream ends when
// next returns end.
func New(frame wdte.Frame, args ...wdte.Func) wdte.Func {
frame = frame.Sub("new")

Expand All @@ -28,12 +30,9 @@ func New(frame wdte.Frame, args ...wdte.Func) wdte.Func {
return nil, false
}

cur := prev
prev = next.Call(frame, prev)
if _, ok := prev.(end); ok {
return nil, false
}

return prev, true
return cur, true
})
}

Expand Down
1 change: 1 addition & 0 deletions std/stream/stream.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ var Scope = wdte.S().Map(map[wdte.ID]wdte.Func{
"enumerate": wdte.GoFunc(Enumerate),
"repeat": wdte.GoFunc(Repeat),
"limit": wdte.GoFunc(Limit),
"skip": wdte.GoFunc(Skip),
"zip": wdte.GoFunc(Zip),

"end": End(),
Expand Down
4 changes: 4 additions & 0 deletions types.go
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,10 @@ func (e Error) Error() string {
return e.Err.Error()
}

func (e Error) Unwrap() error {
return e.Err
}

func (e Error) Reflect(name string) bool { // nolint
return name == "Error"
}
Expand Down
7 changes: 6 additions & 1 deletion wdte_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -515,7 +515,7 @@ func TestStream(t *testing.T) {
{
name: "New",
script: `let s => import 'stream'; s.new 0 (@ f n => + n 1 {> 5 => s.end}) -> s.collect;`,
ret: wdte.Array{wdte.Number(1), wdte.Number(2), wdte.Number(3), wdte.Number(4), wdte.Number(5)},
ret: wdte.Array{wdte.Number(0), wdte.Number(1), wdte.Number(2), wdte.Number(3), wdte.Number(4), wdte.Number(5)},
},
{
name: "Range/1",
Expand Down Expand Up @@ -578,6 +578,11 @@ func TestStream(t *testing.T) {
wdte.Number(0), wdte.Number(1), wdte.Number(2),
},
},
{
name: "Skip",
script: `let s => import 'stream'; s.range 3 -> s.skip 2 -> s.collect;`,
ret: wdte.Array{wdte.Number(2)},
},
{
name: "Zip",
script: `let s => import 'stream'; s.zip (s.range 2) (s.range 1 2) -> s.collect;`,
Expand Down

0 comments on commit 1064790

Please sign in to comment.