///|
/// The conversion context a cursor needs, the readonly-viewer reduction of
/// Monaco's `cursorContext.ts` `CursorContext`. Monaco's holds the model, view
/// model, coordinates converter, and cursor config. The local context needs
/// only the converter to bridge model and view positions; the owning
/// `CursorsController` separately holds the mutable `TextModel` for validation
/// and content-version tracking. The port stores the three exact conversion
/// functions it consumes instead of turning Monaco's structural interface into
/// a runtime MoonBit trait object.
struct CursorContext {
view_to_model_ : (@base_common.Position) -> @base_common.Position
view_range_to_model_ : (@base_common.Range) -> @base_common.Range
model_to_view_ : (@base_common.Position) -> @base_common.Position
}
///|
/// Builds a cursor context from the active view model's required conversions.
pub fn CursorContext::CursorContext(
view_to_model~ : (@base_common.Position) -> @base_common.Position,
view_range_to_model~ : (@base_common.Range) -> @base_common.Range,
model_to_view~ : (@base_common.Position) -> @base_common.Position,
) -> CursorContext {
{
view_to_model_: view_to_model,
view_range_to_model_: view_range_to_model,
model_to_view_: model_to_view,
}
}
///|
/// Converts a view position to its model position.
fn CursorContext::view_to_model(
self : CursorContext,
position : @base_common.Position,
) -> @base_common.Position {
(self.view_to_model_)(position)
}
///|
/// Converts the complete view anchor range to model coordinates. The source's
/// missing-model cursor branch uses the converter's range member as one unit,
/// which can preserve boundary affinity differently from two unrelated point
/// conversions.
fn CursorContext::view_range_to_model(
self : CursorContext,
range : @base_common.Range,
) -> @base_common.Range {
(self.view_range_to_model_)(range)
}
///|
/// Converts a model position to its view position.
fn CursorContext::model_to_view(
self : CursorContext,
position : @base_common.Position,
) -> @base_common.Position {
(self.model_to_view_)(position)
}