Use Cow<'a,B> for toplevel configuration

This commit is contained in:
bakaq
2024-12-12 05:59:59 -03:00
parent 500a6cdaf1
commit 74e3d32ca9
2 changed files with 12 additions and 6 deletions

View File

@@ -1,3 +1,5 @@
use std::borrow::Cow;
use rand::{rngs::StdRng, SeedableRng}; use rand::{rngs::StdRng, SeedableRng};
use crate::Machine; use crate::Machine;
@@ -41,7 +43,7 @@ enum StreamConfigInner {
/// Describes how a [`Machine`](crate::Machine) will be configured. /// Describes how a [`Machine`](crate::Machine) will be configured.
pub struct MachineBuilder { pub struct MachineBuilder {
pub(crate) streams: StreamConfig, pub(crate) streams: StreamConfig,
pub(crate) toplevel: &'static str, pub(crate) toplevel: Cow<'static, str>,
} }
impl Default for MachineBuilder { impl Default for MachineBuilder {
@@ -49,7 +51,7 @@ impl Default for MachineBuilder {
fn default() -> Self { fn default() -> Self {
MachineBuilder { MachineBuilder {
streams: Default::default(), streams: Default::default(),
toplevel: default_toplevel(), toplevel: default_toplevel().into(),
} }
} }
} }
@@ -67,8 +69,8 @@ impl MachineBuilder {
} }
/// Uses the given toplevel in this configuration. /// Uses the given toplevel in this configuration.
pub fn with_toplevel(mut self, toplevel: &'static str) -> Self { pub fn with_toplevel(mut self, toplevel: impl Into<Cow<'static, str>>) -> Self {
self.toplevel = toplevel; self.toplevel = toplevel.into();
self self
} }

View File

@@ -54,6 +54,7 @@ use lazy_static::lazy_static;
use ordered_float::OrderedFloat; use ordered_float::OrderedFloat;
use rand::rngs::StdRng; use rand::rngs::StdRng;
use std::borrow::Cow;
use std::cmp::Ordering; use std::cmp::Ordering;
use std::env; use std::env;
use std::io::Read; use std::io::Read;
@@ -297,13 +298,16 @@ impl Machine {
self.run_module_predicate(atom!("loader"), (atom!("file_load"), 2)); self.run_module_predicate(atom!("loader"), (atom!("file_load"), 2));
} }
fn load_top_level(&mut self, program: &'static str) { fn load_top_level(&mut self, program: Cow<'static, str>) {
let mut path_buf = current_dir(); let mut path_buf = current_dir();
path_buf.push("src/toplevel.pl"); path_buf.push("src/toplevel.pl");
let path = path_buf.to_str().unwrap(); let path = path_buf.to_str().unwrap();
let toplevel_stream = Stream::from_static_string(program, &mut self.machine_st.arena); let toplevel_stream = match program {
Cow::Borrowed(s) => Stream::from_static_string(s, &mut self.machine_st.arena),
Cow::Owned(s) => Stream::from_owned_string(s, &mut self.machine_st.arena),
};
self.load_file(path, toplevel_stream); self.load_file(path, toplevel_stream);