1package funk
2
3import "reflect"
4
5type lazyBuilder struct {
6	exec func() interface{}
7}
8
9func (b *lazyBuilder) Chunk(size int) Builder {
10	return &lazyBuilder{func() interface{} { return Chunk(b.exec(), size) }}
11}
12func (b *lazyBuilder) Compact() Builder {
13	return &lazyBuilder{func() interface{} { return Compact(b.exec()) }}
14}
15func (b *lazyBuilder) Drop(n int) Builder {
16	return &lazyBuilder{func() interface{} { return Drop(b.exec(), n) }}
17}
18func (b *lazyBuilder) Filter(predicate interface{}) Builder {
19	return &lazyBuilder{func() interface{} { return Filter(b.exec(), predicate) }}
20}
21func (b *lazyBuilder) Flatten() Builder {
22	return &lazyBuilder{func() interface{} { return Flatten(b.exec()) }}
23}
24func (b *lazyBuilder) FlattenDeep() Builder {
25	return &lazyBuilder{func() interface{} { return FlattenDeep(b.exec()) }}
26}
27func (b *lazyBuilder) Initial() Builder {
28	return &lazyBuilder{func() interface{} { return Initial(b.exec()) }}
29}
30func (b *lazyBuilder) Intersect(y interface{}) Builder {
31	return &lazyBuilder{func() interface{} { return Intersect(b.exec(), y) }}
32}
33func (b *lazyBuilder) Join(rarr interface{}, fnc JoinFnc) Builder {
34	return &lazyBuilder{func() interface{} { return Join(b.exec(), rarr, fnc) }}
35}
36func (b *lazyBuilder) Map(mapFunc interface{}) Builder {
37	return &lazyBuilder{func() interface{} { return Map(b.exec(), mapFunc) }}
38}
39func (b *lazyBuilder) FlatMap(mapFunc interface{}) Builder {
40	return &lazyBuilder{func() interface{} { return FlatMap(b.exec(), mapFunc) }}
41}
42func (b *lazyBuilder) Reverse() Builder {
43	return &lazyBuilder{func() interface{} { return Reverse(b.exec()) }}
44}
45func (b *lazyBuilder) Shuffle() Builder {
46	return &lazyBuilder{func() interface{} { return Shuffle(b.exec()) }}
47}
48func (b *lazyBuilder) Tail() Builder {
49	return &lazyBuilder{func() interface{} { return Tail(b.exec()) }}
50}
51func (b *lazyBuilder) Uniq() Builder {
52	return &lazyBuilder{func() interface{} { return Uniq(b.exec()) }}
53}
54func (b *lazyBuilder) Without(values ...interface{}) Builder {
55	return &lazyBuilder{func() interface{} { return Without(b.exec(), values...) }}
56}
57
58func (b *lazyBuilder) All() bool {
59	return (&chainBuilder{b.exec()}).All()
60}
61func (b *lazyBuilder) Any() bool {
62	return (&chainBuilder{b.exec()}).Any()
63}
64func (b *lazyBuilder) Contains(elem interface{}) bool {
65	return Contains(b.exec(), elem)
66}
67func (b *lazyBuilder) Every(elements ...interface{}) bool {
68	return Every(b.exec(), elements...)
69}
70func (b *lazyBuilder) Find(predicate interface{}) interface{} {
71	return Find(b.exec(), predicate)
72}
73func (b *lazyBuilder) ForEach(predicate interface{}) {
74	ForEach(b.exec(), predicate)
75}
76func (b *lazyBuilder) ForEachRight(predicate interface{}) {
77	ForEachRight(b.exec(), predicate)
78}
79func (b *lazyBuilder) Head() interface{} {
80	return Head(b.exec())
81}
82func (b *lazyBuilder) Keys() interface{} {
83	return Keys(b.exec())
84}
85func (b *lazyBuilder) IndexOf(elem interface{}) int {
86	return IndexOf(b.exec(), elem)
87}
88func (b *lazyBuilder) IsEmpty() bool {
89	return IsEmpty(b.exec())
90}
91func (b *lazyBuilder) Last() interface{} {
92	return Last(b.exec())
93}
94func (b *lazyBuilder) LastIndexOf(elem interface{}) int {
95	return LastIndexOf(b.exec(), elem)
96}
97func (b *lazyBuilder) NotEmpty() bool {
98	return NotEmpty(b.exec())
99}
100func (b *lazyBuilder) Product() float64 {
101	return Product(b.exec())
102}
103func (b *lazyBuilder) Reduce(reduceFunc, acc interface{}) interface{} {
104	return Reduce(b.exec(), reduceFunc, acc)
105}
106func (b *lazyBuilder) Sum() float64 {
107	return Sum(b.exec())
108}
109func (b *lazyBuilder) Type() reflect.Type {
110	return reflect.TypeOf(b.exec())
111}
112func (b *lazyBuilder) Value() interface{} {
113	return b.exec()
114}
115func (b *lazyBuilder) Values() interface{} {
116	return Values(b.exec())
117}
118