# push_element/2 - efficient sliding window

Bjorn Gustavsson bjorn@REDACTED
Mon Aug 15 09:52:52 CEST 2005

```"Richard A. O'Keefe" <ok@REDACTED> writes:

> With reference to (fixed size) sliding windows,
> I asked whether we really needed built-in support.
>
> "Ulf Wiger" <ulf@REDACTED> replied:
> 	It's about as justified as erlang:make_tuple/2
> 	and erlang:append_element/2.
>
> I guess that's a NO, then.  (:-)
>

I agree. In retrospect, we should not have added those two BIFs.
They are very rarely used.

Maybe we should take them out and replace them with Erlang
functions in the erlang module.

>
> Yep.
>
>     tuple_stuff(Tuple, Amount, Fill, Rotation, Drop, Take)
> 	Tuple		a tuple
> 	Amount		a non-negative integer
> 	Fill		any term
> 	Rotation	an integer in the range -N..+N,
> 			where N = size(Tuple) + Amount
> 	Drop		an integer in the range -N..+N
> 	Take		an integer in the range -M..+M
> 			where M = N - |Drop|
>
>     Step 1:  extend Tuple on the right with Amount copies of Fill
> 	e.g. tuple_stuff({a,b,c}, 2, d, ...) starts with {a,b,c,d,d}.
>
>     Step 2:  rotation Tuple by Rotation.  If Rotation >= 0, take the
> 	last Rotation elements and move them to the front; if Rotation =< 0,
> 	take the first |Rotation| elements and move them to the back.
>
>     Step 3:  if Drop >= 0, discard the first |Drop| elements;
> 	if Drop =< 0, discard the last |Drop| elements.
>
>     Step 4:  if Take >= 0, take the first |Take| elements;
> 	if Take =< 0, take the last |Take| elements.
>

Given a better name, we could consider adding this BIF.

/Bjorn
--
Björn Gustavsson, Erlang/OTP, Ericsson AB

```