Cobweb plot

using Makie

 f(x::Real, r::Real) = r * x * (1 - x)
 function cobweb(
         xᵢ::Real,
         curve_f::Function,
         r::Real;
         nstep::Real = 30
     )::Vector{Point2f0} # col 1 is x, col 2 is y

     a = zeros(nstep*2, 2)
     a[1, 1] = xᵢ
     x = xᵢ
     y = curve_f(x, r)
     ret = similar(Vector{Point2f0}, nstep*2)

     for i  2:2:nstep*2-2
         a[i, 1] = x
         a[i, 2] = y
         x = y
         y = curve_f(x, r)
         a[i+1, 1] = x
         a[i+1, 2] = x
         ret[i] = Point2f0(a[i, 1], a[i, 2])
         ret[i+1] = Point2f0(a[i+1, 1], a[i+1, 2])
     end

     return ret

 end

 xᵢ = 0.1
 rᵢ = 2.8
 xr = 0:0.001:1
 ## setup sliders
 sx, x = textslider(0:0.01:1, "xᵢ", start = xᵢ)
 sr, r = textslider(0:0.01:4, "r", start = rᵢ)
 ## setup lifts
 fs = lift(r -> f.(xr, r), r)
 cw = lift((x, r) -> cobweb(x, f, r), x, r)
 ## setup plots
 sc = lines(               # plot x=y, the bisector line
     xr,                   # xs
     xr,                   # ys
     linestyle = :dash,    # style of line
     linewidth = 3,        # width of line
     color = :blue         # colour of line
 )

 sc[Axis][:names][:axisnames] = ("x(t)", "x(t+1)") # set axis names

 lines!(sc, xr, fs) # plot the curve

 lines!(sc, cw) # plot the cobweb

 final = hbox(sc, vbox(sx, sr))

 record(final, "output.mp4", range(0.01, stop = 5, length = 100)) do i
     r[] = i
end