-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathf_modify.go
97 lines (87 loc) · 1.66 KB
/
f_modify.go
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package f
import "errors"
var (
ErrEmptyList = errors.New("empty list")
)
func (f F[T]) Head() Option[T] {
if len(f.Val) == 0 {
return NewOptE[T](ErrEmptyList)
}
return NewOpt(f.Val[0], nil)
}
func (f F[T]) Last() Option[T] {
if len(f.Val) == 0 {
return NewOptE[T](ErrEmptyList)
}
return NewOpt(f.Val[len(f.Val)-1], nil)
}
func (f F[T]) Tail() F[T] {
if len(f.Val) == 0 || len(f.Val) == 1 {
return F[T]{}
}
_tail := make([]T, len(f.Val)-1)
for i := 1; i < len(f.Val); i++ {
_tail[i-1] = f.Val[i]
}
return F[T]{Val: _tail}
}
func (f F[T]) Reverse() F[T] {
_rev := make([]T, len(f.Val))
for i := len(f.Val) - 1; i >= 0; i-- {
_rev[len(_rev)-1-i] = f.Val[i]
}
return F[T]{
Val: _rev,
}
}
func (f F[T]) TakeWhile(fn func(T) bool) F[T] {
_vals := make([]T, 0)
for _, el := range f.Val {
if fn(el) {
_vals = append(_vals, el)
}
}
return F[T]{
Val: _vals,
}
}
func (f F[T]) DropWhile(fn func(T) bool) F[T] {
_vals := make([]T, 0)
for _, el := range f.Val {
if !fn(el) {
_vals = append(_vals, el)
}
}
return F[T]{
Val: _vals,
}
}
func (f F[T]) ZipWith(other F[T]) F[T] {
_vals := make([]T, 0, len(f.Val)+len(other.Val))
minL := len(other.Val)
if len(f.Val) < len(other.Val) {
minL = len(f.Val)
}
for i := 0; i < minL; i++ {
_vals = append(_vals, f.Val[i], other.Val[i])
}
if len(f.Val) > len(other.Val) {
_vals = append(_vals, f.Val[minL:]...)
} else {
_vals = append(_vals, other.Val[minL:]...)
}
return F[T]{
Val: _vals,
}
}
func (f F[T]) Filter(fn func(T) bool) F[T] {
_filtered := make([]T, 0)
for _, el := range f.Val {
if fn(el) {
_filtered = append(_filtered, el)
}
}
return F[T]{
Val: _filtered,
}
}