# Normalized Easing Functions

I was feeling bored. I was feeling quEASY. I also felt like I needed some curry and composition. What do you do when you have all of these feelings running through your head at once?

[ul]
[li]NORMALIZED EASING FUNCTIONS!!![/li]
[li]EXAMPLE!!![/li]
[/ul]

CODE!!!

[code=lua]local Easing do
local function reverse(fn)
return function(x)
return 1-fn(1-x);
end
end;
local function symmetric(fn)
local r_fn = reverse(fn);
return function(x)
if (x < 0.5) then
return fn(x*2)/2;
else
return 0.5 + r_fn((x - 0.5)*2)/2;
end
end
end;

``````local function linear(x)
return x;
end;
local function polynomial(p)
return function(x)
return x^p;
end
end;
local function exponential(b, r)
r = r or 10;
return function(x)
if (x > 0) then
return b^(r*(x-1));
else
return 0;
end
end
end
local function sin(x)
return math.sin(x * math.pi/2);
end

local function generate(fn)
return {
In = fn,
Out = reverse( fn ),
InOut = symmetric( fn );
OutIn = symmetric( reverse( fn ) );
}
end

Easing = {
Linear = linear;
Cubic = generate( polynomial(3) );
Quartic = generate( polynomial(4) );
Quintic = generate( polynomial(5) );
Exponential = generate( exponential(2) );
Sine = generate( reverse( sin ) ); -- nothing wrong here
}
``````

end[/code]

API!!!

[code]Both x and y are numerical values between 0 and 1.

y = Easing.Linear(x)
y = Easing.Cubic.In(x)
y = Easing.Cubic.Out(x)
y = Easing.Cubic.InOut(x)
y = Easing.Cubic.OutIn(x)
y = Easing.Quartic.In(x)
y = Easing.Quartic.Out(x)
y = Easing.Quartic.InOut(x)
y = Easing.Quartic.OutIn(x)
y = Easing.Quintic.In(x)
y = Easing.Quintic.Out(x)
y = Easing.Quintic.InOut(x)
y = Easing.Quintic.OutIn(x)
y = Easing.Exponential.In(x)
y = Easing.Exponential.Out(x)
y = Easing.Exponential.InOut(x)
y = Easing.Exponential.OutIn(x)
y = Easing.Sine.In(x)
y = Easing.Sine.Out(x)
y = Easing.Sine.InOut(x)
y = Easing.Sine.OutIn(x)[/code]