import {compose} from '@avocado/core'; import {Mixin, Property} from '@avocado/mixins' import * as Vector from './index' export function VectorMixin( vectorKey = 'vector', x = 'x', y = 'y', meta = {}, ) { meta = { default: [0, 0], eq: function(l, r) { return Vector.equals(l, r); }, ...meta, }; let transformedProperty; if (meta.transformProperty) { transformedProperty = meta.transformProperty(vectorKey); } else { transformedProperty = `$$avocado_property_${vectorKey}`; } meta.initialize = function() { this[transformedProperty] = Vector.copy(meta.default); }; let bypassUpdates = false; meta.set = meta.set || function(vector) { this[transformedProperty] = Vector.copy(this[transformedProperty]); if (bypassUpdates) { this[transformedProperty][0] = vector[0]; this[transformedProperty][1] = vector[1]; } else { this[x] = vector[0]; this[y] = vector[1]; } }; const decorate = compose( Property(x, { get: function() { return this[transformedProperty][0]; }, set: function(value) { bypassUpdates = true; this[vectorKey] = [value, this[y]]; bypassUpdates = false; }, track: meta.track, }), Property(y, { get: function() { return this[transformedProperty][1]; }, set: function(value) { bypassUpdates = true; this[vectorKey] = [this[x], value]; bypassUpdates = false; }, track: meta.track, }), Property(vectorKey, meta), ); return (Superclass) => { return class Vector extends decorate(Superclass) {} }; }