// based on the names of the type arguments.
instName := g.instTypeName2(typ.Obj().Name(), typ.TypeArgs())
s := g.pkg(typ.Obj().Pkg()).Lookup(instName)
+
+ // Make sure the base generic type exists in type1 (it may
+ // not yet if we are referecing an imported generic type, as
+ // opposed to a generic type declared in this package). Make
+ // sure to do this lookup before checking s.Def, in case
+ // s.Def gets defined while importing base (if an imported
+ // type). (Issue #50486).
+ base := g.obj(typ.Origin().Obj())
+
if s.Def != nil {
// We have already encountered this instantiation.
// Use the type we previously created, since there
return s.Def.Type()
}
- // Make sure the base generic type exists in type1 (it may
- // not yet if we are referecing an imported generic type, as
- // opposed to a generic type declared in this package).
- base := g.obj(typ.Origin().Obj())
if base.Class == ir.PAUTO {
// If the base type is a local type, we want to pop
// this instantiated type symbol/definition when we
--- /dev/null
+// 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,
+ }
+}
--- /dev/null
+package main
+
+import fp "goerror_fp"
+
+func Fold[A, B any](zero B, a A, f func(B, A) B) B {
+ return f(zero, a)
+}
+
+func main() {
+
+ var v any = "hello"
+ Fold(fp.Seq[any]{}, v, func(seq fp.Seq[any], v any) fp.Seq[any] {
+ return seq.Append(v)
+ })
+
+}
--- /dev/null
+// compiledir -G=3
+
+// Copyright 2021 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 ignored