code: def can_afford(self, item_id: Union[UnitTypeId, UpgradeId, AbilityId], check_supply_cost: bool=True) -> "CanAffordWrapper":
          
          enough_supply = True
          if isinstance(item_id, UnitTypeId):
              unit = self._game_data.units[item_id.value]
              cost = self._game_data.calculate_ability_cost(unit.creation_ability)
              if check_supply_cost:
                  enough_supply = self.can_feed(item_id)
          elif isinstance(item_id, UpgradeId):
              cost = self._game_data.upgrades[item_id.value].cost
          else:
              cost = self._game_data.calculate_ability_cost(item_id)
  
          return CanAffordWrapper(cost.minerals <= self.minerals, cost.vespene <= self.vespene, enough_supply)
docs: Tests if the player has enough resources to build a unit or cast an ability.