rigor-mangrove
MangroveのResult/Optionのunwrap系の戻り値の型を、untypedから呼び出し箇所で運ばれている具体的な型引数へと先鋭化し、さらにEnumのvariants do … endDSLがランタイムで生成するサブクラスを合成して、それらが静的に解決されるようにします。rigor-sorbet(Mangroveのsig/RBIサーフェスを取り込む)の上に重ねて動作します。このプラグインは、sigレベルの型では到達できない2つの精度向上ステップを追加します。ランタイム依存はありません。
rigortypeにバンドルされて配布されます。plugins:の下で(キャリア(carrier)型を供給するrigor-sorbetとともに)有効化します。
plugins: - rigor-sorbet - rigor-mangrove何を推論するか — 診断なし、設定なし
Section titled “何を推論するか — 診断なし、設定なし”このプラグインは独自の診断を発行せず、設定も持ちません。2箇所で型を提供します。その後、エンジンの通常のメソッド存在チェックが、今や既知となった型に対するタイプミスを捕捉します。
unwrap系の戻り値の型。レシーバーが型引数を運んでいるMangroveのキャリアである場合、unwrapの戻り値はその引数にナローイング(narrowing)されます。
# token : Result::Ok[String, StandardError]session.token.unwrap!.uppercaze # error: String に対して未定義のメソッド `uppercaze'Enumバリアントの合成(ADR-36のSlice A)。 variantsDSLはランタイムでネストされたサブクラスを発行します。プラグインはそれらを静的に合成します ── バリアント定数が解決され、.newがディスパッチされ、型付けされた#innerリーダーが宣言されたペイロード型を返します。
class Shape extend Mangrove::Enum variants do variant Circle, Float endend
Shape::Circle.new(1.5).inner.floor # ok — FloatShape::Circle.new(1.5).inner.no_such_float_method # error: Float に対して未定義- コンストラクタからのジェネリック推論はない。
Result::Ok.new("x")は型引数のないキャリアを生むため、そこでのunwrapは何も提供しません(保守的なno-opであり、偽陽性は決して起こりません)。 - ダウンキャストのナローイングは型引数を保持しない(ADR-36のSlice B、保留)。
is_a?を介して親のジェネリックをバリアントへナローイングしても、継承エッジを通して型引数が運ばれることはまだありません。 - 定数でないペイロードのシェイプは劣化する。ペイロードがシェイプ(shape)ハッシュ(
{ name: String })であるバリアントは、Dynamic[Top]にフォールバックします。
プラグインの内部
Section titled “プラグインの内部”キャリアジェネリックのインスタンス化、NestedClassTemplateによるバリアント合成、そしてrigor-sorbetとの関係は、プラグインのREADMEにあります。合成のtierはADR-36です。プラグインの書き方については、examples/とrigor-plugin-authorスキルを参照してください。
© 2026 TypedDuck. Licensed under CC BY-SA 4.0.