///|
/// Separate source-runtime extension; does not modify the pinned classic SDK.
pub fn source_string_package_name() -> @ir.PackageName raise {
  @ir.Path::parse("morphir/moonbit-source")
}

///|
pub fn source_string_specification() -> @ir.PackageSpecification raise {
  let attrs = @ir.TypeAttributes::default()
  let text = @ir.Type::Reference(
    attrs,
    @ir.FQName::parse("morphir/SDK:string#string"),
    [],
  )
  let int = @ir.Type::Reference(
    attrs,
    @ir.FQName::parse("morphir/SDK:basics#int"),
    [],
  )
  let int32 = @ir.Type::Reference(
    attrs,
    @ir.FQName::parse("morphir/SDK:int#int-32"),
    [],
  )
  let values = Map::from_array([
    (
      @ir.Name::parse("require-valid"),
      @ir.Documented::{
        doc: None,
        value: @ir.ValueSpecification::{
          inputs: [
            (@ir.Name::parse("value"), text),
            (@ir.Name::parse("limit"), int),
          ],
          output: text,
          annotations: [],
        },
      },
    ),
    (
      @ir.Name::parse("append-bounded"),
      @ir.Documented::{
        doc: None,
        value: @ir.ValueSpecification::{
          inputs: [
            (@ir.Name::parse("left"), text),
            (@ir.Name::parse("right"), text),
            (@ir.Name::parse("limit"), int),
          ],
          output: text,
          annotations: [],
        },
      },
    ),
    (
      @ir.Name::parse("length-int32"),
      @ir.Documented::{
        doc: None,
        value: @ir.ValueSpecification::{
          inputs: [
            (@ir.Name::parse("value"), text),
            (@ir.Name::parse("limit"), int),
          ],
          output: int32,
          annotations: [],
        },
      },
    ),
    (
      @ir.Name::parse("slice-owned"),
      @ir.Documented::{
        doc: None,
        value: @ir.ValueSpecification::{
          inputs: [
            (@ir.Name::parse("value"), text),
            (@ir.Name::parse("start"), int32),
            (@ir.Name::parse("end"), int32),
            (@ir.Name::parse("limit"), int),
          ],
          output: text,
          annotations: [],
        },
      },
    ),
  ])
  {
    modules: Map::from_array([
      (
        @ir.Path::parse("string"),
        @ir.ModuleSpecification::{
          types: Map([]),
          values,
          doc: None,
          annotations: [],
        },
      ),
    ]),
  }
}