토큰 정보 취합
맵 단계에서 추출된 토큰 정보는 토큰 단위로 그루핑되어 리듀서(reducer)로 전달된다. 토큰 단위로 그루핑된 정보는 map[string][]scanner.Position 타입으로 만들어진다. 가독성을 위해 map[string][]scanner.Position을 커스텀 타입(intermediate)으로 지정한다.
// 키: token // 값: token positions type intermediate map[string][]scanner.Position
intermediate에 partial 정보를 추가하는 기능은 addPartial() 메서드로 작성한다.
func (m intermediate) addPartial(p partial) { positions, ok := m[p.token] if !ok { positions = make([]scanner.Position, 1) } positions = append(positions, p.Position) m[p.token] = positions }
intermediate에 partial 정보가 새로 추가되면 토큰을 키로 하여 위치 정보(scanner.Position)를 추가한다.
마지막으로 collect() 함수를 통해 맵 단계에서 추출되는 정보를 취합한다.
func collect(in <-chan partial) intermediate { tokenPositions := make(intermediate, 10) for t := range in { tokenPositions.addPartial(t) } return tokenPositions }
전체 코드는 collect.go를 참고하기 바란다.