Plaster
New
List
Login
text
apl
aspx
asterisk
brainfuck
c
c++hdr
c++src
cassandra
ceylon
clojure
clojurescript
cmake
cobol
coffeescript
common-lisp
crystal
csharp
css
cypher-query
cython
d
dart
diff
django
dockerfile
dylan
ebnf
ecl
ecmascript
edn
eiffel
ejs
elm
erb
erlang
ez80
factor
fcl
feature
forth
fortran
fragment
gfm
go
gql
groovy
gss
haml
handlebars-template
haskell
haxe
hive
html
http
httpd-php
httpd-php-open
hxml
ini
java
javascript
json
jsp
jsx
julia
kotlin
latex
less
literate-haskell
lua
mariadb
markdown
mbox
mirc
mscgen
msgenny
mssql
mumps
mysql
n-triples
nesc
nginx-conf
nsis
objectivec
octave
oz
pascal
perl
pgp
pgp-keys
pgp-signature
pgsql
php
pig
plsql
properties
protobuf
puppet
python
q
rpm-changes
rpm-spec
rsrc
ruby
rustsrc
sas
sass
scala
scheme
scss
sieve
slim
smarty
solr
soy
sparql-query
spreadsheet
sql
squirrel
stex
styl
swift
systemverilog
tcl
textile
tiddlywiki
tiki
tlv
tornado
ttcn-asn
ttcn-cfg
turtle
twig
typescript
typescript-jsx
vb
vbscript
velocity
verilog
vertex
vhdl
vue
webidl
xml
xml-dtd
xquery
xu
yaml
z80
default
Visibility:
public
unlisted
private
(in-package #:common-lisp) (defpackage #:moving-average (:use #:common-lisp) (:export #:moving-average #:add-sample #:average)) (in-package #:moving-average) (defclass moving-average () ((sample-count :accessor sample-count :initform 0 :type (mod #.array-dimension-limit)) (index :accessor index :initform 0 :type (mod #.array-dimension-limit)) (samples :accessor samples :type simple-vector))) (defmethod initialize-instance :after ((m moving-average) &key maximum-samples) (check-type maximum-samples (mod #.array-dimension-limit)) (setf (samples m) (make-array maximum-samples)) (values)) (defmethod add-sample ((m moving-average) value) (check-type value number) (with-slots (sample-count index samples) m (let ((maximum-samples (length samples))) (setf (aref samples index) value) (setf index (mod (1+ index) maximum-samples)) (when (< sample-count maximum-samples) (incf sample-count)))) (values)) (defmethod average ((m moving-average)) (with-slots (sample-count samples) m (when (zerop sample-count) (error "no samples to average")) (loop repeat sample-count for sample across samples summing sample into total finally (return (/ total sample-count)))))