transformValues = def =>
    def
      .get("props")
      .keySeq()
      .toList()
      .traverse(Either.of, key => {
        const prop = def.getIn(["props", key]);
        return options
          .get("transforms", Immutable.List())
          .reduce((p, t) => p.chain(transformValue(t)), Either.of(prop));
      })
      .map(props =>
        props.reduce(
          (props, prop) => props.set(prop.get("name"), prop),
          Immutable.OrderedMap()
        )
      )
      .map(props => def.set("props", props))
transform each prop value using the provided value transforms