KFKFELOTH4NL4DMXXWJ36OK62HWNJ7JJTHWA76CYHWGTGXMRGYFQC 2CFNOXLKFVAGON3Z2KISH4LNIALNY4VTBILJLQIE45YUKQI6ZHPQC TIAIRD7L5GWH22TOLDAGCIDCJDZ53YWK3KHQOH3EIU7RZEOEP32AC 6W6OJAUT3KLOXXKYR4GA3MG4ACLO2T4KX3SGD2KZDX6MYEZYTPHAC U45XPF3YKPXXRJ4MN24T2RV7GOL4FZKQSWX5P5I7WT4HC5XF4FHAC GUD2J453E3UTRJZIEEUUJ3ZIGL72ETUXTO57XQIZ2Y3ZU3C2R55QC CNJGJCJZ6LRHHIRSRATSE3D3Z5OQGSSTDMXCPVXSKRQLYJFME6IAC DTAIE7PK6TZLNSBQGENS6RT7FFOTMAPSE6ZTPDADINGJF5NTHLWQC 32SDOYNGPOAAMEQMZLZUE3XE6D5CFSZU6M3JDRERUVPAB4TLZOOAC ZL7ZSOEOGP2E24UEFC5VVPN5GTL3EUL34FA7F47WWWFPHJH2RS2AC TKAAHADV62OQORAO7MYRRRHTGPMG3GKXU4Z4MFNLAO6DLTSDU3CAC XCVPXP4UBFU25NF6VQC3MEYHHH45RL2UXM5TA6O23NA64FPCCCJQC KJLCU4X5Z3CZM4AORMWIKOPBWPVTDMLK4LYH7UXBJFUGL7AUQCSQC SEIYD7YXZ5XI4W7UVF5O2UFLA6OCZZCOLV2XB46RKJ5EN6UQC4UAC if bloomIsEmpty left.bits || bloomIsEmpty right.bits then{ bits := ViE.SearchBloom.empty.bits, prefixBytes := pref, suffixBytes := suf }
if !left.hasBits || !right.hasBits then{ bits := ViE.SearchBloom.empty.bits, prefixBytes := pref, suffixBytes := suf, hasBits := false }
let mid := pieces.size / 2let left := fromPieces (pieces.extract 0 mid) ptlet right := fromPieces (pieces.extract mid pieces.size) ptmkInternal #[left, right]termination_by pieces.sizedecreasing_by· simp_wfhave hgt : ViE.NodeCapacity < pieces.size := Nat.lt_of_not_ge (by assumption)have hsize : 0 < pieces.size := Nat.lt_trans (by decide : 0 < ViE.NodeCapacity) hgthave hdiv : pieces.size / 2 < pieces.size := Nat.div_lt_self hsize (by decide : 1 < 2)exact Nat.lt_of_le_of_lt (Nat.min_le_left _ _) hdiv· simp_wfhave hgt : ViE.NodeCapacity < pieces.size := Nat.lt_of_not_ge (by assumption)have hsize : 0 < pieces.size := Nat.lt_trans (by decide : 0 < ViE.NodeCapacity) hgthave hge2 : 2 ≤ pieces.size := Nat.le_trans (by decide : 2 ≤ ViE.NodeCapacity) (Nat.le_of_lt hgt)have hhalf : 0 < pieces.size / 2 := Nat.div_pos hge2 (by decide : 0 < 2)exact Nat.sub_lt hsize hhalf
Id.run dolet mut leaves : Array ViE.PieceTree := #[]let mut i := 0while i < pieces.size dolet j := min (i + ViE.NodeCapacity) pieces.sizeleaves := leaves.push (mkLeaf (pieces.extract i j) pt)i := jlet mut level := leaveswhile level.size > 1 dolet mut parents : Array ViE.PieceTree := #[]let mut k := 0while k < level.size dolet j := min (k + ViE.NodeCapacity) level.sizeparents := parents.push (mkInternal (level.extract k j))k := jlevel := parentsreturn level[0]!
def ensureBufferLoadedById (state : EditorState) (bufId : Nat) : IO EditorState := dolet ws := state.getCurrentWorkspacematch ws.buffers.find? (fun b => b.id == bufId) with| none => pure state| some buf =>if buf.loaded || buf.filename.isNone thenpure stateelselet fname := buf.filename.getD ""let loadedBuf ← ViE.loadBufferByteArrayWithConfig fname state.configlet merged := {loadedBuf withid := buf.iddirty := buf.dirtyloaded := truetable := { loadedBuf.table with undoLimit := state.config.historyLimit }}let s' := state.updateCurrentWorkspace fun ws =>{ ws with buffers := ws.buffers.map (fun b => if b.id == buf.id then merged else b) }pure { s' with message := s!"Loaded \"{fname}\"" }def ensureActiveBufferLoaded (state : EditorState) : IO EditorState := dolet ws := state.getCurrentWorkspacematch ws.layout.findView ws.activeWindowId with| none => pure state| some v => ensureBufferLoadedById state v.bufferId
let buildLeafBits := settings.searchBloomBuildLeafBitslet placeholderFor (id : Nat) (fname : String) : FileBuffer := {id := idfilename := some fnamedirty := falseloaded := falsetable := PieceTable.fromString "" buildLeafBitsmissingEol := falsecache := { lineMap := Lean.RBMap.empty, rawLineMap := Lean.RBMap.empty, lineIndexMap := Lean.RBMap.empty }}let filesArr := files.toArraylet safeActiveIdx := if activeIdx < filesArr.size then activeIdx else 0
let mut nextId := 0for fname in files dolet buf ← loadBufferByteArrayWithConfig fname settingsloaded := loaded.push {buf withid := nextIdtable := { buf.table with undoLimit := settings.historyLimit }}nextId := nextId + 1
for i in [0:filesArr.size] dolet fname := filesArr[i]!if i == safeActiveIdx thenlet buf ← loadBufferByteArrayWithConfig fname settingsloaded := loaded.push {buf withid := iloaded := truetable := { buf.table with undoLimit := settings.historyLimit }}elseloaded := loaded.push (placeholderFor i fname)
let s0 := ({ ViE.initialState with config := ViE.defaultConfig }).updateCurrentWorkspace (fun _ => ws)let s1 := s0.updateCurrentWorkspace fun ws =>{ ws with layout := ws.layout.updateView ws.activeWindowId (fun v => { v with bufferId := 0 }) }let s2 ← ViE.Buffer.ensureActiveBufferLoaded s1let activeLoaded := s2.getActiveBufferassertEqual "Lazy buffer loads on activation" true activeLoaded.loadedassertEqual "Lazy loaded buffer keeps file path" (some f1) activeLoaded.filename