use proc_macro2::TokenStream;
use quote::quote;
use syn::Ident;

pub fn impl_sign(struct_name: &Ident, is_signed: bool) -> TokenStream {
    if is_signed {
        quote! {
            impl std::ops::Neg for #struct_name {
                type Output = Self;

                fn neg(self) -> Self::Output {
                    Self::from_bits(-self.0)
                }
            }

            impl num_traits::sign::Signed for #struct_name {
                fn abs(&self) -> Self {
                    Self::from_bits(self.0.abs())
                }

                fn abs_sub(&self, other: &Self) -> Self {
                    Self::from_bits(self.0.abs_sub(&other.0))
                }

                fn signum(&self) -> Self {
                    Self::new(self.0.signum())
                }

                fn is_positive(&self) -> bool {
                    self.0.is_positive()
                }

                fn is_negative(&self) -> bool {
                    self.0.is_negative()
                }
            }
        }
    } else {
        quote! {
            impl num_traits::sign::Unsigned for #struct_name {}
        }
    }
}
