Untitled

mail@pastecode.io avatar
unknown
typescript
a year ago
2.0 kB
97
Indexable
Never
interface Car {
  price: number;
  pickUpCost: number;
  costPerKm: number;
}

interface IdleState {
  state: "idle";
  totalCost: number;
}

interface UsingState {
  state: "using";
  car: Car;
  totalCost: number;
}

interface InvalidState {
  state: "invalid";
}

interface PickUpAction {
  type: "pickUp";
  car: Car;
}

interface DropOffAction {
  type: "dropOff";
  totalKm: number;
}

interface AccidentAction {
  type: "accident";
  percentage: number;
}

type State = IdleState | UsingState | InvalidState;
type Action = PickUpAction | DropOffAction | AccidentAction;

function nextState(
  action: Action,
  currentState: State = {
    state: "idle",
    totalCost: 0,
  }
): State {
  switch (currentState.state) {
    case "idle": {
      if (action.type === "pickUp") {
        return {
          state: "using",
          car: action.car,
          totalCost: currentState.totalCost + action.car.pickUpCost,
        };
      } else {
        return {
          state: "invalid",
        };
      }
    }
    case "using": {
      if (action.type === "dropOff") {
        return {
          state: "idle",
          totalCost:
            currentState.totalCost +
            action.totalKm * currentState.car.costPerKm,
        };
      } else if (action.type === "accident") {
        return {
          ...currentState,
          totalCost:
            currentState.totalCost +
            (action.percentage * currentState.car.price) / 100.0,
        };
      } else {
        return {
          state: "invalid",
        };
      }
    }
    default: {
      return {
        state: "invalid",
      };
    }
  }
}

function readSpyName(): string {
  throw new Error("Implement this")
}
function readAction(): Action {
  throw new Error("Implement this")
}

function main() {

  const cars = new Map<string, Car>()
  
  // read cars to Cars
  const states = new Map<string, State>()

  // loop through all events
  const spy = readSpyName()
  states.set(spy, nextState(readAction(), states.get(spy)))

}