package main // // a word-count application "plugin" for MapReduce. // // go build -buildmode=plugin wc.go // import "6.5840/mr" import "unicode" import "strings" import "strconv" // The map function is called once for each file of input. The first // argument is the name of the input file, and the second is the // file's complete contents. You should ignore the input file name, // and look only at the contents argument. The return value is a slice // of key/value pairs. func Map(filename string, contents string) []mr.KeyValue { // function to detect word separators. ff := func(r rune) bool { return !unicode.IsLetter(r) } // split contents into an array of words. words := strings.FieldsFunc(contents, ff) kva := []mr.KeyValue{} for _, w := range words { kv := mr.KeyValue{w, "1"} kva = append(kva, kv) } return kva } // The reduce function is called once for each key generated by the // map tasks, with a list of all the values created for that key by // any map task. func Reduce(key string, values []string) string { // return the number of occurrences of this word. return strconv.Itoa(len(values)) }