#![allow(dead_code)]
use simple_update_in::{Accessor, Map, Value};
pub fn n(x: f64) -> Value {
Value::Number(x)
}
pub fn s(x: &str) -> Value {
Value::String(x.to_string())
}
pub fn arr(items: Vec<Value>) -> Value {
Value::array(items)
}
pub fn obj(pairs: Vec<(&str, Value)>) -> Value {
let mut map = Map::new();
for (k, v) in pairs {
map.insert(k.to_string(), v);
}
Value::object(map)
}
pub fn hole() -> Value {
Value::Undefined
}
pub fn key(k: &str) -> Accessor {
Accessor::key(k)
}
pub fn idx(i: usize) -> Accessor {
Accessor::index(i)
}
pub fn constant(value: Value) -> impl Fn(Value) -> Value {
move |_| value.clone()
}
pub fn multiply(factor: f64) -> impl Fn(Value) -> Value {
move |v| match v {
Value::Number(x) => Value::Number(x * factor),
other => other,
}
}
pub fn identity(v: Value) -> Value {
v
}
pub fn guarded_multiply(factor: f64) -> impl Fn(Value) -> Value {
move |v| match v {
Value::Number(x) if x != 0.0 && !x.is_nan() => Value::Number(x * factor),
Value::Bool(true) => Value::Bool(true),
Value::String(ref st) if !st.is_empty() => v,
Value::Array(_) | Value::Object(_) => v,
_ => Value::Undefined,
}
}
pub fn remove(obj: Value, path: &[Accessor]) -> Value {
simple_update_in::update_in(obj, path, None)
}
pub fn run(obj: Value, path: &[Accessor], updater: impl Fn(Value) -> Value) -> Value {
simple_update_in::update_in(obj, path, Some(&updater))
}