summaryrefslogtreecommitdiffstats
path: root/test/typeparam/issue50486.dir/goerror_fp.go
diff options
context:
space:
mode:
Diffstat (limited to 'test/typeparam/issue50486.dir/goerror_fp.go')
-rw-r--r--test/typeparam/issue50486.dir/goerror_fp.go75
1 files changed, 75 insertions, 0 deletions
diff --git a/test/typeparam/issue50486.dir/goerror_fp.go b/test/typeparam/issue50486.dir/goerror_fp.go
new file mode 100644
index 0000000..fec9095
--- /dev/null
+++ b/test/typeparam/issue50486.dir/goerror_fp.go
@@ -0,0 +1,75 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package goerror_fp
+
+type Seq[T any] []T
+
+func (r Seq[T]) Size() int {
+ return len(r)
+}
+
+func (r Seq[T]) Append(items ...T) Seq[T] {
+ tail := Seq[T](items)
+ ret := make(Seq[T], r.Size()+tail.Size())
+
+ for i := range r {
+ ret[i] = r[i]
+ }
+
+ for i := range tail {
+ ret[i+r.Size()] = tail[i]
+ }
+
+ return ret
+}
+
+func (r Seq[T]) Iterator() Iterator[T] {
+ idx := 0
+
+ return Iterator[T]{
+ IsHasNext: func() bool {
+ return idx < r.Size()
+ },
+ GetNext: func() T {
+ ret := r[idx]
+ idx++
+ return ret
+ },
+ }
+}
+
+type Iterator[T any] struct {
+ IsHasNext func() bool
+ GetNext func() T
+}
+
+func (r Iterator[T]) ToSeq() Seq[T] {
+ ret := Seq[T]{}
+ for r.HasNext() {
+ ret = append(ret, r.Next())
+ }
+ return ret
+}
+
+func (r Iterator[T]) Map(f func(T) any) Iterator[any] {
+ return MakeIterator(r.HasNext, func() any {
+ return f(r.Next())
+ })
+}
+
+func (r Iterator[T]) HasNext() bool {
+ return r.IsHasNext()
+}
+
+func (r Iterator[T]) Next() T {
+ return r.GetNext()
+}
+
+func MakeIterator[T any](has func() bool, next func() T) Iterator[T] {
+ return Iterator[T]{
+ IsHasNext: has,
+ GetNext: next,
+ }
+}