UNPKG

ember-material-icons

Version:

Google Material icons for your ember-cli app

57 lines (45 loc) 1.81 kB
import { EvaluatedArgs } from '../expressions/args'; import { expect } from '@glimmer/util'; import { RevisionTag, Reference, ConstReference, ReferenceIterator, IterationArtifacts } from '@glimmer/reference'; import { APPEND_OPCODES, OpcodeName as Op } from '../../opcodes'; class IterablePresenceReference implements Reference<boolean> { public tag: RevisionTag; private artifacts: IterationArtifacts; constructor(artifacts: IterationArtifacts) { this.tag = artifacts.tag; this.artifacts = artifacts; } value(): boolean { return !this.artifacts.isEmpty(); } } APPEND_OPCODES.add(Op.PutIterator, vm => { let listRef = vm.frame.getOperand(); let args = expect(vm.frame.getArgs(), 'PutIteratorOpcode expects a populated args register'); let iterable = vm.env.iterableFor(listRef, args); let iterator = new ReferenceIterator(iterable); vm.frame.setIterator(iterator); vm.frame.setCondition(new IterablePresenceReference(iterator.artifacts)); }); APPEND_OPCODES.add(Op.EnterList, (vm, { op1: start, op2: end }) => { vm.enterList(start, end); }); APPEND_OPCODES.add(Op.ExitList, vm => vm.exitList()); APPEND_OPCODES.add(Op.EnterWithKey, (vm, { op1: start, op2: end }) => { let key = expect(vm.frame.getKey(), 'EnterWithKeyOpcode expects a populated key register'); vm.enterWithKey(key, start, end); }); const TRUE_REF = new ConstReference(true); const FALSE_REF = new ConstReference(false); APPEND_OPCODES.add(Op.NextIter, (vm, { op1: end }) => { let item = vm.frame.getIterator().next(); if (item) { vm.frame.setCondition(TRUE_REF); vm.frame.setKey(item.key); vm.frame.setOperand(item.value); vm.frame.setArgs(EvaluatedArgs.positional([item.value, item.memo])); } else { vm.frame.setCondition(FALSE_REF); vm.goto(end); } });