Skip to content

Instantly share code, notes, and snippets.

@eschen42
Created October 13, 2018 01:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eschen42/075a3fdfae35262e8c4538b3d48f50d1 to your computer and use it in GitHub Desktop.
Save eschen42/075a3fdfae35262e8c4538b3d48f50d1 to your computer and use it in GitHub Desktop.
Icon code for Apply, Reduce, and MovingAverage
procedure Apply(f, L)
local result, x
result := []
every x := !L do put(result, f(x)) | fail
return result
end
procedure Reduce(f, L)
if *L > 1
then return f( L[1], Reduce( f, L[2:0] ) )
else return L[1]
end
$define MovingAverageFilterDepth 4
record moving_average(result, queue)
procedure MovingAverage(moving_average_record, latest)
if type(moving_average_record) ~== "moving_average" then stop("MovingAverage: first argument must be a moving_average record but was ", type(moving_average_record))
if type(moving_average_record.queue) ~== "list" then stop("MovingAverage: moving_average_record.queue must be a list")
if *(moving_average_record.queue) = 0
then every 1 to MovingAverageFilterDepth do put(moving_average_record.queue, 0)
pop(moving_average_record.queue)
put(moving_average_record.queue, latest)
return Reduce("+", moving_average_record.queue) / real(*moving_average_record.queue)
end
link trees, ximage
procedure main()
local my_moving_average
my_moving_average := moving_average(0, [])
write(MovingAverage(my_moving_average, 1))
write(MovingAverage(my_moving_average, 2))
write(MovingAverage(my_moving_average, 4))
write(MovingAverage(my_moving_average, 8))
write(ximage(my_moving_average.queue))
write(ximage(Apply(sqrt,my_moving_average.queue)))
write(MovingAverage(my_moving_average, 0))
write(MovingAverage(my_moving_average, 0))
write(MovingAverage(my_moving_average, 0))
write(ximage(Apply(sqrt,my_moving_average.queue)))
write(MovingAverage(my_moving_average, 0))
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment