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)