// check-pass trait Document { type Cursor<'a>: DocCursor<'a> where Self: 'a; fn cursor(&self) -> Self::Cursor<'_>; } struct DocumentImpl {} impl Document for DocumentImpl { type Cursor<'a> = DocCursorImpl<'a>; fn cursor(&self) -> Self::Cursor<'_> { DocCursorImpl { document: &self, } } } trait DocCursor<'a> {} struct DocCursorImpl<'a> { document: &'a DocumentImpl, } impl<'a> DocCursor<'a> for DocCursorImpl<'a> {} struct Lexer<'d, Cursor> where Cursor: DocCursor<'d>, { cursor: Cursor, _phantom: std::marker::PhantomData<&'d ()>, } impl<'d, Cursor> Lexer<'d, Cursor> where Cursor: DocCursor<'d>, { pub fn from(document: &'d Doc) -> Lexer<'d, Cursor> where Doc: Document = Cursor>, { Lexer { cursor: document.cursor(), _phantom: std::marker::PhantomData, } } } pub fn main() { let doc = DocumentImpl {}; let lexer: Lexer<'_, DocCursorImpl<'_>> = Lexer::from(&doc); }