summaryrefslogtreecommitdiffstats
path: root/test/typeparam/issue50486.dir/goerror_fp.go
blob: fec9095f79678f6cb6f91c7fe06d62b84f72c948 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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,
	}
}