# Map Reduce Lab Design Doc
- **`master.go`**
```go
import "container/list"
// What do mappers need? A filename
// What do mappers output? A filename, and the location of each key?
type JobStatus struct {
WorkPackets map[uuid.UUID]*Element // Element contains WorkPacket
Pending *list.List,
InProgress *list.List,
}
func (j *JobStatus) Done() bool {
return j.Pending.Len() + j.InProgress.Len() == 0
}
type Master struct {
nReduce int,
mapStatus JobStatus,
reduceStatus JobStatus,
}
func (m *Master) GetWork(args *GetWorkArgs, reply *GetWorkReply) error
func (m *Master) WorkDone(args *WorkDoneArgs, reply *WorkDoneReply) error
```
- **`rpc.go`**
```go
type WorkType int
const (
MAP WorkType = iota,
REDUCE,
)
type WorkPacket struct {
TypeOfWork WorkType,
InputFilenames []string,
Id uuid.UUID,
}
type GetWorkArgs struct {}
//mr-X-Y, where X is the Map task number, and Y is the reduce task number.
type GetWorkReply struct {
Packet WorkPacket
}
type WorkDoneArgs struct {
Id uuid.UUID
OutputFilenames []string
}
type WorkDoneReply struct {}
```