message: Add slightly better typing for string iterators
  Summary: Now we have V::String, we can be a little bit more precise.
diff: @@ -25,6 +25,8 @@ use gazebo::coerce::Coerce;
  use crate as starlark;
  use crate::values::Heap;
  use crate::values::StarlarkValue;
  +use crate::values::StringValue;
  +use crate::values::StringValueLike;
  use crate::values::Value;
  use crate::values::ValueLike;
  @@ -41,28 +43,26 @@ use crate::values::ValueLike;
  )]
  #[display(fmt = "iterator")]
  #[repr(C)]
  -struct StringIteratorGen<V> {
  - string: V,
  +struct StringIteratorGen<'v, V: ValueLike<'v>> {
  + string: V::String,
  produce_char: bool, // if not char, then int
  }
  -pub(crate) fn iterate_chars<'v>(string: Value<'v>, heap: &'v Heap) -> Value<'v> {
  - heap.alloc(StringIterator {
  +pub(crate) fn iterate_chars<'v>(string: StringValue<'v>, heap: &'v Heap) -> Value<'v> {
  + heap.alloc_complex(StringIteratorGen::<'v, Value<'v>> {
  string,
  produce_char: true,
  })
  }
  -pub(crate) fn iterate_codepoints<'v>(string: Value<'v>, heap: &'v Heap) -> Value<'v> {
  - heap.alloc(StringIterator {
  +pub(crate) fn iterate_codepoints<'v>(string: StringValue<'v>, heap: &'v Heap) -> Value<'v> {
  + heap.alloc_complex(StringIteratorGen::<'v, Value<'v>> {
  string,
  produce_char: false,
  })
  }
  -starlark_complex_value!(StringIterator);
  -
  -impl<'v, T: ValueLike<'v> + 'v> StarlarkValue<'v> for StringIteratorGen<T>
  +impl<'v, V: ValueLike<'v> + 'v> StarlarkValue<'v> for StringIteratorGen<'v, V>
  where
  Self: ProvidesStaticType,
  {
  @@ -75,7 +75,7 @@ where
  where
  'v: 'a,
  {
  - let s = self.string.to_value().unpack_str().unwrap().chars();
  + let s = self.string.as_str().chars();
  if self.produce_char {
  Ok(Box::new(s.map(move |x| heap.alloc(x))))
  } else {
  @@ -88,7 +88,7 @@ where
  heap: &'v Heap,
  f: &mut dyn FnMut(&mut dyn Iterator<Item = Value<'v>>) -> anyhow::Result<()>,
  ) -> anyhow::Result<()> {
  - let s = self.string.to_value().unpack_str().unwrap().chars();
  + let s = self.string.as_str().chars();
  if self.produce_char {
  f(&mut s.map(|x| heap.alloc(x)))
  } else {
  