Buffering

As mentioned in the section on transformations, you can implement apply! as an inplace version of apply to support buffered transformations. Usually, the result of a regular apply can be used as a buffer. You may write

buffer = apply(tfm, item)
apply!(buffer, tfm, item)

However, for some transformations, a different buffer is needed. Sequence, for example, needs to reuse all intermediate results. That is why the buffer creation can be customized:


Managing the buffers manually quickly becomes tedious. For convenience, this library implements DataAugmentation.Buffered, a transformation wrapper that will use a buffer internally. btfm = Buffered(tfm) will create a buffer the first time it is applyed and then use it by internally calling apply!.

buffered = Buffered(tfm)
buffer = apply(tfm, item)  # uses apply! internally

Since Buffered only stores one buffer, you may run into problems when using it in a multi-threading context where different threads invalidate the buffer before it can be used. In that case, you can use DataAugmentation.BufferedThreadsafe, a version of Buffered that keeps a separate buffer for every thread.