let formatResource resource =
sprintf " %d %A" resource.Amount resource.Type
let formatResources resources =
|> Seq.map formatResource
let createResource rtype amount =
{ Type = rtype; Amount = amount }
let rec consume num rtype resources=
| [] -> [ createResource rtype -num ]
then { x with Amount = x.Amount - num } :: xs
else x :: consume num rtype xs
let rec produce num rtype resources =
| [] -> [ createResource rtype num ]
then { x with Amount = x.Amount + num } :: xs
else x :: produce num rtype xs
| Peasant -> produce 5 Wheat
| Woodcutter -> produce 1 Wood
| Baker -> produce 1 Bread >> consume 1 Wood >> consume 3 Wheat
let formatWorker worker =
sprintf " %A %s (age %d)" worker.Type worker.Name worker.Age
let formatWorkers workers =
let work workers resources =
|> Seq.fold (fun res worker -> workAs worker.Type res) resources
let eat workers resources =
resources |> consume (Seq.length workers) Bread
let createWorker wtype name age = { Type = wtype; Name = name; Age = age }
let formatKingdom kingdom =
sprintf "Workers:\n%s\nResources:\n%s\n" (formatWorkers kingdom.Workers) (formatResources kingdom.Resources)
Resources = kingdom.Resources |> work kingdom.Workers |> eat kingdom.Workers }
createWorker Peasant "Bob" 32
createWorker Woodcutter "Heinz" 17
createWorker Baker "Methusalem" 92