//
//  CAMediaTimingFunctions+Extended.swift
//  Geiger
//
//  Created by Ryan McLeod on 1/22/19.
//  Copyright © 2019 Grow Pixel. All rights reserved.
//

import UIKit

extension CAMediaTimingFunction {

    static func linear()        -> CAMediaTimingFunction { return CAMediaTimingFunction(name: .linear) }
    static func easeIn()        -> CAMediaTimingFunction { return CAMediaTimingFunction(name: .easeIn) }
    static func easeOut()       -> CAMediaTimingFunction { return CAMediaTimingFunction(name: .easeOut) }
    static func easeInEaseOut() -> CAMediaTimingFunction { return CAMediaTimingFunction(name: .easeInEaseOut) }
  
    static func swiftOut()      -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints: 0.4, 0.2, 0, 1) }

    static func sineIn()     -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0.45, 0, 1, 1) }
    static func sineOut()    -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0, 0, 0.55, 1) }
    static func sineInOut()  -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0.45, 0, 0.55, 1) }

    static func quadIn()     -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0.43, 0, 0.82, 0.60) }
    static func quadOut()    -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0.18, 0.4, 0.57, 1) }
    static func quadInOut()  -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0.43, 0, 0.57, 1) }

    static func cubicIn()    -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0.67, 0, 0.84, 0.54) }
    static func cubicOut()   -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0.16, 0.46, 0.33, 1) }
    static func cubicInOut() -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0.65, 0, 0.35, 1) }

    static func quartIn()    -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0.81, 0, 0.77, 0.34) }
    static func quartOut()   -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0.23, 0.66, 0.19, 1) }
    static func quartInOut() -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0.81, 0, 0.19, 1) }

    static func quintIn()    -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0.89, 0, 0.81, 0.27) }
    static func quintOut()   -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0.19, 0.73, 0.11, 1) }
    static func quintInOut() -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0.9, 0, 0.1, 1) }

    static func expoIn()     -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:1.04, 0, 0.88, 0.49) }
    static func expoOut()    -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0.12, 0.51, -0.4, 1) }
    static func expoInOut()  -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0.95, 0, 0.05, 1) }

    static func circIn()     -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0.6, 0, 1, 0.45) }
    static func circOut()    -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:1, 0.55, 0.4, 1) }
    static func circInOut()  -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0.82, 0, 0.18, 1) }

    static func backIn()     -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0.77, -0.63, 1, 1) }
    static func backOut()    -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0, 0, 0.23, 1.37) }
    static func backInOut()  -> CAMediaTimingFunction { return CAMediaTimingFunction(controlPoints:0.77, -0.63, 0.23, 1.37) }
}