dev@241: /** dev@241: * Created by lucast on 26/04/2017. dev@241: */ dev@241: import {StreamingResponse} from 'piper/StreamingService'; dev@241: import {Feature} from 'piper/Feature'; dev@241: import {SampleType} from 'piper'; dev@241: dev@241: export const arrayReducer = (acc: T[], val: T[]): T[] => { dev@241: acc.push.apply(acc, val); dev@241: return acc; dev@241: }; dev@241: dev@241: export const typedArrayReducer = (acc: Float32Array, dev@241: val: Float32Array): Float32Array => { dev@241: return Float32Array.of(...acc, ...val); dev@241: }; dev@241: dev@241: const inPlaceTypedArrayReducer = (acc: Float32Array, dev@241: val: Float32Array, dev@241: i: number): Float32Array => { dev@241: acc.set(val, i); dev@241: return acc; dev@241: }; dev@241: dev@241: export const streamingResponseReducer = (acc: StreamingResponse, dev@241: val: StreamingResponse, dev@241: i: number): StreamingResponse => { dev@241: acc.processedBlockCount = val.processedBlockCount; dev@241: if (acc.features.data instanceof Array && dev@241: val.features.data instanceof Array) { dev@241: acc.features.data = arrayReducer( dev@241: acc.features.data, dev@241: val.features.data dev@241: ); dev@241: } else if (acc.features.data instanceof Float32Array && dev@241: val.features.data instanceof Float32Array) { dev@241: const isOneSamplePerStep = acc.outputDescriptor.configured.sampleType === dev@241: SampleType.OneSamplePerStep; dev@241: if (isOneSamplePerStep) { dev@241: // for one sample per step vectors we know there will be totalBlockCount dev@241: // number of samples - so pre-allocate the Float32Array when we know dev@241: // the totalBlockCount (after receiving the first feature) dev@241: if ( i === 1 ) { dev@241: const newBlock = new Float32Array(acc.totalBlockCount); dev@241: newBlock[0] = acc.features.data[0]; dev@241: acc.features.data = newBlock; dev@241: } dev@241: acc.features.data = inPlaceTypedArrayReducer( dev@241: acc.features.data, dev@241: val.features.data, dev@241: i dev@241: ); dev@241: } else { // if not OneSamplePerStep we have to make a new array each time dev@241: acc.features.data = typedArrayReducer( dev@241: acc.features.data, dev@241: val.features.data dev@241: ); dev@241: } dev@241: } else { dev@241: throw new Error('Invalid feature output. Aborting'); dev@241: } dev@241: return acc; dev@241: };