module Numeric.LazySplines.Examples where
import Numeric.LazySplines


duckDeathAtAge = [ (10, [0]),
                   (10, [0.2]),
                   (15, [0.2, 0.01]) ]
initialLife = [(1, [0])]

survival :: Spline
survival = 1 - duckLife

duckLife = initialLife ++ integrateSpline duckLife'

duckLife' = duckDeathAtAge * survival


initialSpring = [(0.01, [-0.5, 1, 18])]

spring'' = -36 * spring
    `trimmingTo` 15

spring :: Spline
spring = initialSpring ++
           liftS (initialSpring `at` 0.01) +
           integrateSpline (integrateSpline spring'')

spring2'' = -36 * spring2
    `trimmingTo` 15
    `extrapForward` 0.01
spring2   = initialSpring ++
              liftS (initialSpring `at` 0.01) +
              integrateSpline
                 (integrateSpline spring2'')


flameDefect f = deriveSpline f - (f ^ 2) * (1 - f)

initialFlame = [(1, [0.01, 9.9e-5])]

flame' = flame^2 * (1 - flame)
    `trimmingTo` 15
    `extrapForward` 1

flame :: Spline
flame  = initialFlame ++
           (liftS (initialFlame `at` 1) +
           integrateSpline flame')


flamePred :: SplinePredicate
flamePred t d f  = v' - v^2 * (1 - v)
  where v  = f `at` d
        v' = diff f `at` d

flame2' = flame2^2 * (1 - flame2)
    `trimmingTo` 15
    `extrapForward` 1

flame2 :: Spline
flame2 = initialFlame ++
           liftS (initialFlame `at` 1) +
           integrateSpline flame2'
    `satisfying` (0.00001, flamePred)

flame3' = flame3^2 * (1 - flame3)
    `trimmingTo` 15
    `extrapForward` 1

flame3 :: Spline
flame3 = initialFlame ++
           liftS (initialFlame `at` 1) +
           integrateSpline flame3'
    `splitWhen`  (0.00001, 0.125, flamePred)
    `satisfying` (0.00001, flamePred)

flame4' = flame4^2 * (1 - flame4)
    `trimmingTo` 15
    `extrapForward` 1

flame4 :: Spline
flame4 = initialFlame ++
           liftS (initialFlame `at` 1) +
           integrateSpline flame4'
    `splitWhen`  (0.00001, 0.125, flamePred)
    `satisfying` (0.00001, flamePred)
    `extendWhen` (0.00001, 8, flamePred)


flame5' = flame5^2 * (1 - flame5)
    `extrapForward` 1

flame5 :: Spline
flame5 = initialFlame ++
           liftS (initialFlame `at` 1) +
           integrateSpline flame5'
    `trimSmart`  flamePred
    `splitWhen`  (0.00001, 0.125, flamePred)
    `satisfying` (0.00001, flamePred)
    `extendWhen` (0.00001, 8, flamePred)