use crate::codec::{CodecError, Decoder, Encoder};
use crate::types::{AnyTerm, Env, Float};
impl<'id> Encoder<'id> for f64 {
fn encode(&self, env: impl Env<'id>) -> Result<AnyTerm<'id>, CodecError> {
Float::from_f64(env, *self).ok_or(CodecError::NotFinite)?.encode(env)
}
}
impl<'id> Decoder<'id> for f64 {
fn decode(term: AnyTerm<'id>, env: impl Env<'id>) -> Result<Self, CodecError> {
Ok(Float::decode(term, env)?.to_f64(env))
}
}
impl<'id> Encoder<'id> for f32 {
fn encode(&self, env: impl Env<'id>) -> Result<AnyTerm<'id>, CodecError> {
Float::from_f64(env, f64::from(*self)).ok_or(CodecError::NotFinite)?.encode(env)
}
}
impl<'id> Decoder<'id> for f32 {
fn decode(term: AnyTerm<'id>, env: impl Env<'id>) -> Result<Self, CodecError> {
let val = Float::decode(term, env)?.to_f64(env);
if val.abs() > f64::from(f32::MAX) {
return Err(CodecError::FloatRange);
}
Ok(val as f32)
}
}