use std::io::{Write, Error};
use std::mem;
const MAX_DISTANCE: f32 = 126.0;
pub fn squish_float<Target: Write>(target: &mut Target, last: f64, next: f64) -> Result<usize, Error> {
let last = if last.is_infinite() || last.is_nan() { 0.0 } else { last };
let diff = (next - last) as f32;
if last.is_nan() || next.is_nan() || diff.abs() > MAX_DISTANCE {
let nan: u16 = 0b1000_0000_0000_0000;
let bit_pattern: u32 = unsafe { mem::transmute(diff) };
target.write(&[(nan&0xff) as u8, (nan>>8) as u8])?;
target.write(&[
((bit_pattern>>0) &0xff) as u8,
((bit_pattern>>8) &0xff) as u8,
((bit_pattern>>16)&0xff) as u8,
((bit_pattern>>24)&0xff) as u8
])
} else {
let fixed_point = (diff * 256.0) as i16;
target.write(&[(fixed_point&0xff) as u8, (fixed_point>>8) as u8])
}
}