Skip to content

Commit

Permalink
DRY up append, intersect and union
Browse files Browse the repository at this point in the history
  • Loading branch information
XiphiasUvella committed May 13, 2016
1 parent 13658da commit 6e9e5d3
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 136 deletions.
65 changes: 65 additions & 0 deletions addon/-private/create-multi-array-helper.js
@@ -0,0 +1,65 @@
import Ember from 'ember';
import {
A as emberArray,
isEmberArray as isArray
} from 'ember-array/utils';
import Helper from 'ember-helper';
import { guidFor } from 'ember-metal/utils';
import computed from 'ember-computed';
import observer from 'ember-metal/observer';
import get from 'ember-metal/get';
import set from 'ember-metal/set';
import { isEmpty } from 'ember-utils';

const { defineProperty } = Ember;
const idForArray = (array) => `__array-${guidFor(array)}`;

export default function(multiArrayComputed) {
return Helper.extend({
compute([...arrays]) {
set(this, 'arrays', arrays.map((obj) => {
if (isArray(obj)) {
return emberArray(obj)
}

return obj;
}));

return get(this, 'content');
},

valuesDidChange: observer('arrays.[]', function() {
this._recomputeArrayKeys();

let arrays = get(this, 'arrays');
let arrayKeys = get(this, 'arrayKeys');

if (isEmpty(arrays)) {
defineProperty(this, 'content', []);
return;
}

defineProperty(this, 'content', multiArrayComputed(...arrayKeys));
}),

contentDidChange: observer('content.[]', function() {
this.recompute();
}),

_recomputeArrayKeys() {
let arrays = get(this, 'arrays');

let oldArrayKeys = get(this, 'arrayKeys') || [];
let newArrayKeys = arrays.map(idForArray);

let keysToRemove = oldArrayKeys.filter((key) => {
return newArrayKeys.indexOf(key) === -1;
});

keysToRemove.forEach((key) => set(this, key, null));
arrays.forEach((array) => set(this, idForArray(array), array));

set(this, 'arrayKeys', newArrayKeys);
}
});
}
48 changes: 4 additions & 44 deletions addon/helpers/append.js
@@ -1,22 +1,15 @@
import Ember from 'ember';
import { isEmberArray as isArray } from 'ember-array/utils';
import computed from 'ember-computed';
import Helper from 'ember-helper';
import get from 'ember-metal/get';
import observer from 'ember-metal/observer';
import set from 'ember-metal/set';
import { guidFor } from 'ember-metal/utils';
import { isEmpty } from 'ember-utils';

const { defineProperty } = Ember;

const idForArray = (array) => `__array-${guidFor(array)}`;
import { isEmberArray as isArray } from 'ember-array/utils';
import createMultiArrayHelper from '../-private/create-multi-array-helper';

export function append(...dependentKeys) {
dependentKeys = dependentKeys || [];
let arrayKeys = dependentKeys.map((dependentKey) => {
return `${dependentKey}.[]`;
});

return computed(...arrayKeys, function() {
let array = dependentKeys.map((dependentKey) => {
let value = get(this, dependentKey);
Expand All @@ -27,37 +20,4 @@ export function append(...dependentKeys) {
});
}

export default Helper.extend({
compute([...arrays]) {
set(this, 'arrays', arrays);

return get(this, 'content');
},

valuesDidChange: observer('arrays.[]', function() {
let arrays = get(this, 'arrays');

let oldArrayKeys = get(this, 'arrayKeys') || [];
let newArrayKeys = arrays.map(idForArray);

let keysToRemove = oldArrayKeys.filter((key) => {
return newArrayKeys.indexOf(key) === -1;
});

keysToRemove.forEach((key) => set(this, key, null));
arrays.forEach((array) => set(this, idForArray(array), array));

set(this, 'arrayKeys', newArrayKeys);

if (isEmpty(arrays)) {
defineProperty(this, 'content', []);
return;
}

defineProperty(this, 'content', append(...newArrayKeys));
}),

contentDidChange: observer('content.[]', function() {
this.recompute();
})
});
export default createMultiArrayHelper(append);
48 changes: 2 additions & 46 deletions addon/helpers/intersect.js
@@ -1,48 +1,4 @@
import Ember from 'ember';
import { A as emberArray } from 'ember-array/utils';
import { intersect } from 'ember-computed';
import Helper from 'ember-helper';
import get from 'ember-metal/get';
import observer from 'ember-metal/observer';
import set from 'ember-metal/set';
import { guidFor } from 'ember-metal/utils';
import { isEmpty } from 'ember-utils';
import createMultiArrayHelper from '../-private/create-multi-array-helper';

const { defineProperty } = Ember;

const idForArray = (array) => `__array-${guidFor(array)}`;

export default Helper.extend({
compute([...arrays]) {
set(this, 'arrays', arrays);

return get(this, 'content');
},

arraysDidChange: observer('arrays.[]', function() {
let arrays = get(this, 'arrays');

let oldArrayKeys = get(this, 'arrayKeys') || [];
let newArrayKeys = arrays.map(idForArray);

let keysToRemove = oldArrayKeys.filter((key) => {
return newArrayKeys.indexOf(key) === -1;
});

keysToRemove.forEach((key) => set(this, key, null));
arrays.forEach((array) => set(this, idForArray(array), emberArray(array)));

set(this, 'arrayKeys', newArrayKeys);

if (isEmpty(arrays)) {
defineProperty(this, 'content', []);
return;
}

defineProperty(this, 'content', intersect(...newArrayKeys));
}),

contentDidChange: observer('content.[]', function() {
this.recompute();
})
});
export default createMultiArrayHelper(intersect);
48 changes: 2 additions & 46 deletions addon/helpers/union.js
@@ -1,48 +1,4 @@
import Ember from 'ember';
import { A as emberArray } from 'ember-array/utils';
import { union } from 'ember-computed';
import Helper from 'ember-helper';
import get from 'ember-metal/get';
import observer from 'ember-metal/observer';
import set from 'ember-metal/set';
import { guidFor } from 'ember-metal/utils';
import { isEmpty } from 'ember-utils';
import createMultiArrayHelper from '../-private/create-multi-array-helper';

const { defineProperty } = Ember;

const idForArray = (array) => `__array-${guidFor(array)}`;

export default Helper.extend({
compute([...arrays]) {
set(this, 'arrays', arrays);

return get(this, 'content');
},

arraysDidChange: observer('arrays.[]', function() {
let arrays = get(this, 'arrays');

let oldArrayKeys = get(this, 'arrayKeys') || [];
let newArrayKeys = arrays.map(idForArray);

let keysToRemove = oldArrayKeys.filter((key) => {
return newArrayKeys.indexOf(key) === -1;
});

keysToRemove.forEach((key) => set(this, key, null));
arrays.forEach((array) => set(this, idForArray(array), emberArray(array)));

set(this, 'arrayKeys', newArrayKeys);

if (isEmpty(arrays)) {
defineProperty(this, 'content', []);
return;
}

defineProperty(this, 'content', union(...newArrayKeys));
}),

contentDidChange: observer('content.[]', function() {
this.recompute();
})
});
export default createMultiArrayHelper(union);

0 comments on commit 6e9e5d3

Please sign in to comment.