fn_der 0.1.3

A trait for functions that have a derivative
Documentation
#![feature(unboxed_closures)]
#![feature(const_trait_impl)]
#![feature(const_mut_refs)]
#![feature(associated_type_defaults)]

use fn_grad::*;

#[const_trait]
pub trait FnDerOnce<Arg>: FnOnce<(Arg,)> + ~const FnGradOnce<(Arg,)>
{
    fn derivative_once(self, arg: Arg) -> Self::GradientOutput
    where
        Self: Sized
    {
        self.gradient_once((arg,))
    }
}

#[const_trait]
pub trait FnDerMut<Arg>: FnDerOnce<Arg> + FnMut<(Arg,)> + ~const FnGradMut<(Arg,)>
{
    fn derivative_mut(&mut self, arg: Arg) -> Self::GradientOutput
    {
        self.gradient_mut((arg,))
    }
}

#[const_trait]
pub trait FnDer<Arg>: FnDerMut<Arg> + Fn<(Arg,)> + ~const FnGrad<(Arg,)>
{
    fn derivative(&self, arg: Arg) -> Self::GradientOutput
    {
        self.gradient((arg,))
    }
}