import {State} from "./State" const isArray = require("lodash/isArray") const contains = require("lodash/includes") const take = require("lodash/take") const size = require("lodash/size") const without = require("lodash/without") const update = require("react-addons-update") export class LevelState extends State> { value:Array getValue() { return this.value || [] } add(level:number, val) { var ob = this.getValue() if (!isArray(ob[level])) { ob = update(ob, { [level]:{$set:[]} }) } ob = update(ob, { [level]:{$push:[val]} }) return this.create(ob) } contains(level:number, val) { return contains(this.getValue()[level], val) } clear(level:number=0) { return this.create(take(this.getValue(), level)) } remove(level:number, val) { return this.create(update(this.getValue(), { [level]:{$set:without(this.getValue()[level], val)} })) } toggle(level:number, val) { if(this.contains(level, val)) { return this.remove(level, val); } else { return this.add(level, val); } } getLevel(level:number):Array { return this.getValue()[level] || []; } levelHasFilters(level:number):boolean { return this.getLevel(level).length > 0; } getLeafLevel() { return size(this.value) -1; } isLeafLevel(level:number):boolean { return level === this.getLeafLevel() } toggleLevel(level, key):LevelState{ if (this.contains(level, key)) { if (this.isLeafLevel(level)) { return this.clear(level); } else { return this.clear(level+1); } } else { return this.clear(level) .add(level, key) } } }