a gleam implementation of a CS assignment originally written in cpp

feat: split the scanning state machine into its own function

Changed files
+28 -15
src
+28 -15
src/bible_search.gleam
··· 29 29 ) 30 30 } 31 31 32 + pub type ScanResult { 33 + ScanResult(ref: Reference, verse: Result(String, String)) 34 + } 35 + 32 36 pub fn parse_reference(input: String) -> Result(Reference, String) { 33 37 let parts = string.split(input, on: " ") 34 38 ··· 62 66 } 63 67 } 64 68 65 - pub fn main() -> Nil { 66 - let assert Ok(bible) = simplifile.read(from: filepath) 67 - 68 - let biblelines = string.split(bible, on: "\n") 69 - 70 - let assert Ok(search) = input(prompt: "> ") 71 - 72 - let assert Ok(reference) = parse_reference(search) 73 - 74 - let inital = 69 + pub fn bible_scan( 70 + reference reference: Reference, 71 + bible bible: String, 72 + ) -> ScanResult { 73 + let inital_state = 75 74 ScanState( 76 75 phase: Book, 77 76 ref: reference, ··· 80 79 verse_text: Error("Verse not found"), 81 80 ) 82 81 82 + let bible_lines = string.split(bible, "\n") 83 + 83 84 let result = 84 - list.fold(biblelines, inital, fn(state, line) -> ScanState { 85 + list.fold(bible_lines, inital_state, fn(state, line) -> ScanState { 85 86 case state.phase { 86 87 Done -> state 87 88 Book -> ··· 122 123 } 123 124 }) 124 125 125 - case result.verse_text { 126 + ScanResult(ref: reference, verse: result.verse_text) 127 + } 128 + 129 + pub fn main() -> Nil { 130 + let assert Ok(bible) = simplifile.read(from: filepath) 131 + 132 + let assert Ok(search) = input(prompt: "> ") 133 + 134 + let assert Ok(reference) = parse_reference(search) 135 + 136 + let scan = bible_scan(reference, bible) 137 + 138 + case scan.verse { 126 139 Ok(text) -> 127 140 io.println( 128 - result.ref.book 141 + scan.ref.book 129 142 <> " " 130 - <> int.to_string(result.ref.chapter) 143 + <> int.to_string(scan.ref.chapter) 131 144 <> ":" 132 - <> int.to_string(result.ref.verse) 145 + <> int.to_string(scan.ref.verse) 133 146 <> " " 134 147 <> text, 135 148 )