use num_complex::Complex;
use std::ops::{Deref, DerefMut};
#[derive(Debug, Copy, Clone, Hash, Eq, PartialEq)]
#[repr(transparent)]
pub struct Real<T>(pub T);
impl<T> Deref for Real<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<T> DerefMut for Real<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
impl<T> Real<T> {
pub fn from_boxed_slice(s: Box<[T]>) -> Box<[Real<T>]> {
unsafe { std::mem::transmute(s) }
}
}
pub trait Mappable<A, B> {
type Target;
fn map<F>(self, f: F) -> Self::Target where F: Fn(A) -> B;
}
impl<A, B> Mappable<A, B> for Complex<A> {
type Target = Complex<B>;
fn map<F>(self, f: F) -> Self::Target where F: Fn(A) -> B {
Self::Target {
re: f(self.re),
im: f(self.im)
}
}
}
impl<A, B> Mappable<A, B> for Real<A> {
type Target = Real<B>;
fn map<F>(self, f: F) -> Self::Target where F: Fn(A) -> B {
Real(f(self.0))
}
}
pub trait MutMappable<T> {
fn map_mut<F>(&mut self, f: F) where F: Fn(&mut T);
}
impl<T> MutMappable<T> for Complex<T> {
fn map_mut<F>(&mut self, f: F) where F: Fn(&mut T) {
f(&mut self.re);
f(&mut self.im);
}
}
impl<T> MutMappable<T> for Real<T> {
fn map_mut<F>(&mut self, f: F) where F: Fn(&mut T) {
f(&mut self.0);
}
}
pub trait RefMappable<A, B> {
type Target;
fn map_ref<F>(&self, f: F) -> Self::Target where F: Fn(&A) -> B;
}
impl<A, B> RefMappable<A, B> for Complex<A> {
type Target = Complex<B>;
fn map_ref<F>(&self, f: F) -> Self::Target where F: Fn(&A) -> B {
Self::Target {
re: f(&self.re),
im: f(&self.im)
}
}
}
impl<A, B> RefMappable<A, B> for Real<A> {
type Target = Real<B>;
fn map_ref<F>(&self, f: F) -> Self::Target where F: Fn(&A) -> B {
Real(f(&self.0))
}
}
pub trait Init<T> {
fn init<F>(f: F) -> Self where F: Fn() -> T;
}
impl<T> Init<T> for Complex<T> {
fn init<F>(f: F) -> Self where F: Fn() -> T {
Complex {
re: f(),
im: f()
}
}
}
impl<T> Init<T> for Real<T> {
fn init<F>(f: F) -> Self where F: Fn() -> T {
Self(f())
}
}
pub trait InitValue<T> {
fn init_value(v: T) -> Self;
}
impl<T> InitValue<T> for Complex<T> where T: Clone {
fn init_value(v: T) -> Self {
Complex {
re: v.clone(),
im: v,
}
}
}
impl<T> InitValue<T> for Real<T> {
fn init_value(v: T) -> Self {
Real(v)
}
}
pub trait Merge<A, B> {
fn merge<F>(self, f: F) -> B where F: Fn(&[A]) -> B;
}
impl<A, B> Merge<A, B> for Complex<A> {
fn merge<F>(self, f:F) -> B where F: Fn(&[A]) -> B {
f(&[self.re, self.im])
}
}
impl<A, B> Merge<A, B> for Real<A> {
fn merge<F>(self, f:F) -> B where F: Fn(&[A]) -> B {
f(&[self.0])
}
}