def write_words.loop
mylsm-lsm-store@0.6.0.1 · src/Fs.bend:116
import mylsm-lsm-store@0.6.0.1/src/Fs.bend as Fs
import Base
import mylsm-lsm-store@0.6.0.1/src/FilesCompat.bend as PackedFiles
116def write_words.loop(
117 fuel: Nat,
118 state: WriteWordsState
119) ->
120 IO(File & Result<&1, &1, U32 & String, Unit>):
121 match fuel:
122 case 0n:
123 match state:
124 case WriteWordsNeed{file, _, _, _, empty}:
125 match empty:
126 case True{}:
127 IO.pure(File & Result<&1, &1, U32 & String, Unit>,
128 (file, Done{Unit{}}))
129 case False{}:
130 IO.pure(File & Result<&1, &1, U32 & String, Unit>,
131 (file, Fail{(7, "write ran out of bounded progress steps")}))
132 case WriteWordsFailed{file, error}:
133 IO.pure(File & Result<&1, &1, U32 & String, Unit>,
134 (file, Fail{error}))
135 case WriteWordsNoProgress{file}:
136 IO.pure(File & Result<&1, &1, U32 & String, Unit>,
137 (file, Fail{(5, "write made no progress")}))
138 case 1n+rest:
139 match state:
140 case WriteWordsNeed{file, (for_write_offset, for_read_offset),
141 (for_write, for_read), words, empty}:
142 match empty:
143 case True{}:
144 IO.pure(File & Result<&1, &1, U32 & String, Unit>,
145 (file, Done{Unit{}}))
146 case False{}:
147 do IO<File & Result<&1, &1, U32 & String, Unit>>:
148 pair : File & Result<&1, &1, U32 & String, U32 & Array<U32>> <-
149 PackedFiles.write.words.once(file, for_write_offset,
150 U32.min(65536, for_write), words)
151 write_words.loop(rest,
152 write_words.after(pair, for_read_offset, for_read))
153 case WriteWordsFailed{file, error}:
154 IO.pure(File & Result<&1, &1, U32 & String, Unit>,
155 (file, Fail{error}))
156 case WriteWordsNoProgress{file}:
157 IO.pure(File & Result<&1, &1, U32 & String, Unit>,
158 (file, Fail{(5, "write made no progress")}))