pub fn u8_err<A: Allocator, T>(
    allocator: &mut A,
    o: &A::AtomBuf,
    msg: &str,
) -> Result<T, EvalErr<A::Ptr>> {
    let op = allocator.buf(&o);
    let buf = op.to_vec();
    err(allocator.new_atom(&buf)?, msg)
}
// TODO: if we pass in A::Ptr instead of A::AtomBuf, we don't have to allocate a
// new atom, and we could avoid the akward possibility of failing to allocate
// the error message
if we pass in A::Ptr instead of A::AtomBuf, we don't have to allocate a
new atom, and we could avoid the akward possibility of failing to allocate
the error message
if we pass in A :: Ptr instead of A :: AtomBuf we don ' t have to allocate a new atom and we could avoid the akward possibility of failing to allocate the error message
pub fn u8_err<A: Allocator, T>(
    allocator: &mut A,
    o: &A::AtomBuf,
    msg: &str,
) -> Result<T, EvalErr<A::Ptr>> {
    let op = allocator.buf(&o);
    let buf = op.to_vec();
    err(allocator.new_atom(&buf)?, msg)
}
pub fn u8_err < A : Allocator , T > ( allocator : & mut A , o : & A :: AtomBuf , msg : & str , ) -> Result < T , EvalErr < A :: Ptr > > { let op = allocator . buf ( & o ) ; let buf = op . to_vec ( ) ; err ( allocator . new_atom ( & buf ) ? , msg ) }
TODO: if we pass in A::Ptr instead of A::AtomBuf, we don't have to allocate a
new atom, and we could avoid the akward possibility of failing to allocate
the error message
TODO : if we pass in A :: Ptr instead of A :: AtomBuf we don ' t have to allocate a new atom and we could avoid the akward possibility of failing to allocate the error message
allocator
&mut A
o
&A::AtomBuf
msg
&str
allocator
&mut A
o
&A::AtomBuf
msg
&str