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
···
)
}
+
pub type ScanResult {
+
ScanResult(ref: Reference, verse: Result(String, String))
+
}
+
pub fn parse_reference(input: String) -> Result(Reference, String) {
let parts = string.split(input, on: " ")
···
}
}
-
pub fn main() -> Nil {
-
let assert Ok(bible) = simplifile.read(from: filepath)
-
-
let biblelines = string.split(bible, on: "\n")
-
-
let assert Ok(search) = input(prompt: "> ")
-
-
let assert Ok(reference) = parse_reference(search)
-
-
let inital =
+
pub fn bible_scan(
+
reference reference: Reference,
+
bible bible: String,
+
) -> ScanResult {
+
let inital_state =
ScanState(
phase: Book,
ref: reference,
···
verse_text: Error("Verse not found"),
)
+
let bible_lines = string.split(bible, "\n")
+
let result =
-
list.fold(biblelines, inital, fn(state, line) -> ScanState {
+
list.fold(bible_lines, inital_state, fn(state, line) -> ScanState {
case state.phase {
Done -> state
Book ->
···
}
})
-
case result.verse_text {
+
ScanResult(ref: reference, verse: result.verse_text)
+
}
+
+
pub fn main() -> Nil {
+
let assert Ok(bible) = simplifile.read(from: filepath)
+
+
let assert Ok(search) = input(prompt: "> ")
+
+
let assert Ok(reference) = parse_reference(search)
+
+
let scan = bible_scan(reference, bible)
+
+
case scan.verse {
Ok(text) ->
io.println(
-
result.ref.book
+
scan.ref.book
<> " "
-
<> int.to_string(result.ref.chapter)
+
<> int.to_string(scan.ref.chapter)
<> ":"
-
<> int.to_string(result.ref.verse)
+
<> int.to_string(scan.ref.verse)
<> " "
<> text,
)