This operates on raw IDs and costs; no type safety. The thing containing this transforms to/from higher-level types.