mirror of
https://github.com/golang/go
synced 2024-09-15 22:20:06 +00:00
13c912d192
The loading of the base type in typ0() may cause s.Def to be defined for the instantiated type, so load the base type before checking s.Def. Fixes #50486 Change-Id: Ic039bc8f774dda534f4ccd1f920220b7a10dede6 Reviewed-on: https://go-review.googlesource.com/c/go/+/377094 Trust: Dan Scales <danscales@google.com> Run-TryBot: Dan Scales <danscales@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
76 lines
1.2 KiB
Go
76 lines
1.2 KiB
Go
// 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,
|
|
}
|
|
}
|