never executed always true always false
1 {-|
2 Easing functions modify the rate of change in animations.
3 More examples can be seen here: <https://easings.net/>.
4 -}
5 module Reanimate.Ease
6 ( Signal
7 , constantS
8 , fromToS
9 , reverseS
10 , curveS
11 , powerS
12 , bellS
13 , oscillateS
14 , cubicBezierS
15 ) where
16
17 -- | Signals are time-varying variables. Signals can be composed using function
18 -- composition.
19 type Signal = Double -> Double
20
21 -- | Constant signal.
22 --
23 -- Example:
24 --
25 -- > signalA (constantS 0.5) drawProgress
26 --
27 -- <<docs/gifs/doc_constantS.gif>>
28 constantS :: Double -> Signal
29 constantS = const
30
31 -- | Signal with new starting and end values.
32 --
33 -- Example:
34 --
35 -- > signalA (fromToS 0.8 0.2) drawProgress
36 --
37 -- <<docs/gifs/doc_fromToS.gif>>
38 fromToS :: Double -> Double -> Signal
39 fromToS from to t = from + (to-from)*t
40
41 -- | Reverse signal order.
42 --
43 -- Example:
44 --
45 -- > signalA reverseS drawProgress
46 --
47 -- <<docs/gifs/doc_reverseS.gif>>
48 reverseS :: Signal
49 reverseS t = 1-t
50
51 -- | S-curve signal. Takes a steepness parameter. 2 is a good default.
52 --
53 -- Example:
54 --
55 -- > signalA (curveS 2) drawProgress
56 --
57 -- <<docs/gifs/doc_curveS.gif>>
58 curveS :: Double -> Signal
59 curveS steepness s =
60 if s < 0.5
61 then 0.5 * (2*s)**steepness
62 else 1-0.5 * (2 - 2*s)**steepness
63
64 -- | Power curve signal. Takes a steepness parameter. 2 is a good default.
65 --
66 -- Example:
67 --
68 -- > signalA (powerS 2) drawProgress
69 --
70 -- <<docs/gifs/doc_powerS.gif>>
71 powerS :: Double -> Signal
72 powerS steepness s = s**steepness
73
74 -- | Oscillate signal.
75 --
76 -- Example:
77 --
78 -- > signalA oscillateS drawProgress
79 --
80 -- <<docs/gifs/doc_oscillateS.gif>>
81 oscillateS :: Signal
82 oscillateS t =
83 if t < 1/2
84 then t*2
85 else 2-t*2
86
87 -- | Bell-curve signal. Takes a steepness parameter. 2 is a good default.
88 --
89 -- Example:
90 --
91 -- > signalA (bellS 2) drawProgress
92 --
93 -- <<docs/gifs/doc_bellS.gif>>
94 bellS :: Double -> Signal
95 bellS steepness = curveS steepness . oscillateS
96
97 -- | Cubic Bezier signal. Gives you a fair amount of control over how the
98 -- signal will curve.
99 --
100 -- Example:
101 --
102 -- > signalA (cubicBezierS (0.0, 0.8, 0.9, 1.0)) drawProgress
103 --
104 -- <<docs/gifs/doc_cubicBezierS.gif>>
105 cubicBezierS :: (Double, Double, Double, Double) -> Signal
106 cubicBezierS (x1, x2, x3, x4) s =
107 let ms = 1-s
108 in x1*ms^(3::Int) + 3*x2*ms^(2::Int)*s + 3*x3*ms*s^(2::Int) + x4*s^(3::Int)