@@ -95,47 +95,42 @@ func (i *RepositoryIter) Close() error {
95
95
return nil
96
96
}
97
97
98
- type funcInitRepository func (Repository , interface {}) error
99
- type funcNextRow func (interface {}) (sql.Row , error )
100
- type funcClose func (interface {}) error
98
+ // RowRepoIterImplementation is the interface needed by each iterator
99
+ // implementation
100
+ type RowRepoIterImplementation interface {
101
+ InitRepository (Repository ) error
102
+ Next () (sql.Row , error )
103
+ Close () error
104
+ }
101
105
102
106
// RowRepoIter is used as the base to iterate over all the repositories
103
107
// in the pool. It needs three functions that execute specific code per
104
108
// implemented iterator.
105
109
type RowRepoIter struct {
106
110
repositoryIter * RepositoryIter
107
111
repository * Repository
108
- data interface {}
109
-
110
- funcInitRepository funcInitRepository
111
- funcNextRow funcNextRow
112
- funcClose funcClose
112
+ implementation RowRepoIterImplementation
113
113
}
114
114
115
115
// NewRowRepoIter initializes a new repository iterator.
116
116
//
117
117
// * pool: is a RepositoryPool we want to iterate
118
- // * data: this pointer will be passed to the provided functions and is useful
119
- // to save state like initialized iterators or other needed variables
120
- // * init: called when a new repository is about to be iterated, initialize
121
- // its iterator there
122
- // * next: called for each row
123
- // * close: called when a repository finished iterating
124
- func NewRowRepoIter (pool * RepositoryPool , data interface {},
125
- init funcInitRepository , next funcNextRow ,
126
- close funcClose ) (RowRepoIter , error ) {
118
+ // * impl: implementation with RowRepoIterImplementation interface
119
+ // * InitRepository: called when a new repository is about to be iterated,
120
+ // initialize its iterator there
121
+ // * Next: called for each row
122
+ // * Close: called when a repository finished iterating
123
+ func NewRowRepoIter (pool * RepositoryPool ,
124
+ impl RowRepoIterImplementation ) (RowRepoIter , error ) {
127
125
128
126
rIter , err := pool .RepoIter ()
129
127
if err != nil {
130
128
return RowRepoIter {}, err
131
129
}
132
130
133
131
repo := RowRepoIter {
134
- repositoryIter : rIter ,
135
- funcInitRepository : init ,
136
- funcNextRow : next ,
137
- funcClose : close ,
138
- data : data ,
132
+ repositoryIter : rIter ,
133
+ implementation : impl ,
139
134
}
140
135
141
136
err = repo .nextRepository ()
@@ -156,7 +151,7 @@ func (i *RowRepoIter) nextRepository() error {
156
151
}
157
152
158
153
i .repository = repo
159
- err = i .funcInitRepository (* repo , i . data )
154
+ err = i .implementation . InitRepository (* repo )
160
155
if err != nil {
161
156
return err
162
157
}
@@ -167,7 +162,7 @@ func (i *RowRepoIter) nextRepository() error {
167
162
// Next gets the next row
168
163
func (i * RowRepoIter ) Next () (sql.Row , error ) {
169
164
for {
170
- row , err := i .funcNextRow ( i . data )
165
+ row , err := i .implementation . Next ( )
171
166
172
167
switch err {
173
168
case nil :
@@ -191,9 +186,7 @@ func (i *RowRepoIter) Next() (sql.Row, error) {
191
186
192
187
// Close called to close the iterator
193
188
func (i * RowRepoIter ) Close () error {
194
- if i .funcClose != nil {
195
- return i .funcClose (i .data )
196
- }
189
+ return i .implementation .Close ()
197
190
198
191
return nil
199
192
}
0 commit comments