@Override
  public boolean isAvailable(Resource resource) {
    checkNotNull(resource);
    checkArgument(resource instanceof DiscreteResource || resource instanceof ContinuousResource);

    // check if it's registered or not.
    Versioned<Set<Resource>> v = childMap.get(resource.parent().get());
    if (v == null || !v.value().contains(resource)) {
      return false;
    }

    if (resource instanceof DiscreteResource) {
      // check if already consumed
      return getConsumers((DiscreteResource) resource).isEmpty();
    } else {
      ContinuousResource requested = (ContinuousResource) resource;
      ContinuousResource registered =
          v.value()
              .stream()
              .filter(c -> c.id().equals(resource.id()))
              .findFirst()
              .map(c -> (ContinuousResource) c)
              .get();
      if (registered.value() < requested.value()) {
        // Capacity < requested, can never satisfy
        return false;
      }
      // check if there's enough left
      return isAvailable(requested);
    }
  }