더북(TheBook)

토큰 정보 취합

맵 단계에서 추출된 토큰 정보는 토큰 단위로 그루핑되어 리듀서(reducer)로 전달된다. 토큰 단위로 그루핑된 정보는 map[string][]scanner.Position 타입으로 만들어진다. 가독성을 위해 map[string][]scanner.Position을 커스텀 타입(intermediate)으로 지정한다.

// 키: token
// 값: token positions
type intermediate map[string][]scanner.Position

intermediatepartial 정보를 추가하는 기능은 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
}

intermediatepartial 정보가 새로 추가되면 토큰을 키로 하여 위치 정보(scanner.Position)를 추가한다.

마지막으로 collect() 함수를 통해 맵 단계에서 추출되는 정보를 취합한다.

func collect(in <-chan partial) intermediate {
    tokenPositions := make(intermediate, 10)
    for t := range in {
        tokenPositions.addPartial(t)
    }
    return tokenPositions
}

전체 코드는 collect.go를 참고하기 바란다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.