This is an automated email from the ASF dual-hosted git repository.

okram pushed a commit to branch tp4
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit d56b089fc2b7bdaa2d535858647c731e765cb694
Author: Marko A. Rodriguez <okramma...@gmail.com>
AuthorDate: Thu Mar 7 14:33:33 2019 -0700

    Coefficients are now wrapped in Coefficient<C> objects and passed around 
through functions and traversers. This was the only way to make it clean. Added 
StringFactory which gives Bytecode and Traversals standard toString() 
representations. Stubbed the strategy/ package and interface. Processors now 
implement Iterator<Traverser>. This makes sense as its up to the Traversal to 
get traversers from the processor and stream them out (unpack them) to the 
user. The processor is now completel [...]
---
 .../org/apache/tinkerpop/language/Symbols.java     |  1 +
 .../org/apache/tinkerpop/language/Traversal.java   | 36 +++++++-
 .../apache/tinkerpop/language/TraversalSource.java | 24 ++++--
 .../java/org/apache/tinkerpop/language/__.java     |  4 +-
 .../tinkerpop/machine/bytecode/Bytecode.java       |  7 +-
 .../tinkerpop/machine/bytecode/BytecodeUtil.java   |  3 +-
 .../tinkerpop/machine/bytecode/Instruction.java    | 10 ++-
 .../{Coefficients.java => Coefficient.java}        | 19 +++--
 .../machine/coefficients/LongCoefficient.java      | 98 ++++++++++++++++++++++
 .../machine/coefficients/LongCoefficients.java     | 56 -------------
 .../Coefficients.java => compiler/Strategy.java}   | 17 ++--
 .../machine/functions/AbstractFunction.java        | 13 +--
 .../tinkerpop/machine/functions/CFunction.java     |  4 +-
 .../machine/functions/filter/IdentityFilter.java   |  4 +-
 .../machine/functions/filter/IsFilter.java         |  7 +-
 .../machine/functions/initial/InjectInitial.java   |  9 +-
 .../tinkerpop/machine/functions/map/IncrMap.java   |  5 +-
 .../tinkerpop/machine/functions/map/MapMap.java    | 12 +--
 .../tinkerpop/machine/functions/map/PathMap.java   |  5 +-
 .../machine/processor/EmptyProcessor.java          |  6 +-
 .../tinkerpop/machine/processor/Processor.java     |  8 +-
 .../tinkerpop/machine/traversers/Traverser.java    | 12 +--
 .../tinkerpop/machine/traversers/TraverserSet.java | 13 ++-
 .../util/FastNoSuchElementException.java           |  2 +-
 .../org/apache/tinkerpop/util/StringFactory.java   | 68 +++++++++++++++
 .../apache/tinkerpop/machine/TraversalTest.java    |  4 +-
 .../machine/compiler/BytecodeUtilTest.java         |  4 +-
 .../tinkerpop/machine/pipes/AbstractStep.java      | 12 +--
 .../apache/tinkerpop/machine/pipes/EmptyStep.java  |  2 +-
 .../tinkerpop/machine/pipes/InitialStep.java       |  9 +-
 .../org/apache/tinkerpop/machine/pipes/Pipes.java  | 36 ++------
 .../org/apache/tinkerpop/machine/pipes/Step.java   |  4 +-
 .../apache/tinkerpop/machine/pipes/PipesTest.java  | 11 ++-
 33 files changed, 348 insertions(+), 177 deletions(-)

diff --git a/java/core/src/main/java/org/apache/tinkerpop/language/Symbols.java 
b/java/core/src/main/java/org/apache/tinkerpop/language/Symbols.java
index 387a209..681e26e 100644
--- a/java/core/src/main/java/org/apache/tinkerpop/language/Symbols.java
+++ b/java/core/src/main/java/org/apache/tinkerpop/language/Symbols.java
@@ -24,6 +24,7 @@ package org.apache.tinkerpop.language;
 public final class Symbols {
 
     public static final String AS = "as";
+    public static final String C = "c";
     public static final String IDENTITY = "identity";
     public static final String IS = "is";
     public static final String INCR = "incr";
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/language/Traversal.java 
b/java/core/src/main/java/org/apache/tinkerpop/language/Traversal.java
index 4021d08..7acdd75 100644
--- a/java/core/src/main/java/org/apache/tinkerpop/language/Traversal.java
+++ b/java/core/src/main/java/org/apache/tinkerpop/language/Traversal.java
@@ -19,9 +19,11 @@
 package org.apache.tinkerpop.language;
 
 import org.apache.tinkerpop.machine.bytecode.Bytecode;
+import org.apache.tinkerpop.machine.coefficients.Coefficient;
 import org.apache.tinkerpop.machine.processor.Processor;
 import org.apache.tinkerpop.machine.processor.ProcessorFactory;
 import org.apache.tinkerpop.machine.traversers.Path;
+import org.apache.tinkerpop.machine.traversers.Traverser;
 
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -33,11 +35,13 @@ import java.util.List;
 public class Traversal<C, S, E> implements Iterator<E> {
 
     protected final Bytecode<C> bytecode;
-    private C currentCoefficient;
+    private Coefficient<C> currentCoefficient;
     private final ProcessorFactory factory;
     private Processor<C, S, E> processor;
+    private long lastCount = 0L;
+    private E lastObject = null;
 
-    public Traversal(final C unity, final ProcessorFactory factory) {
+    public Traversal(final Coefficient<C> unity, final ProcessorFactory 
factory) {
         this.currentCoefficient = unity;
         this.bytecode = new Bytecode<>();
         this.factory = factory;
@@ -53,6 +57,11 @@ public class Traversal<C, S, E> implements Iterator<E> {
         return this;
     }
 
+    public Traversal<C, S, E> c(final C coefficient) {
+        this.currentCoefficient.set(coefficient);
+        return this;
+    }
+
     public Traversal<C, S, E> identity() {
         this.bytecode.addInstruction(this.currentCoefficient, 
Symbols.IDENTITY);
         return this;
@@ -83,6 +92,9 @@ public class Traversal<C, S, E> implements Iterator<E> {
         return (Traversal) this;
     }
 
+    ///////
+
+
     private void setupProcessor() {
         if (null == this.processor)
             this.processor = this.factory.mint(this.bytecode);
@@ -91,13 +103,23 @@ public class Traversal<C, S, E> implements Iterator<E> {
     @Override
     public boolean hasNext() {
         this.setupProcessor();
-        return this.processor.hasNextTraverser();
+        return this.lastCount > 0 || this.processor.hasNext();
     }
 
     @Override
     public E next() {
         this.setupProcessor();
-        return this.processor.nextTraverser().object();
+        if (this.lastCount > 0) {
+            this.lastCount--;
+            return this.lastObject;
+        } else {
+            final Traverser<C, E> traverser = this.processor.next();
+            if (traverser.coefficient().count() > 1) {
+                this.lastObject = traverser.object();
+                this.lastCount = traverser.coefficient().count() - 1L;
+            }
+            return traverser.object();
+        }
     }
 
     public List<E> toList() {
@@ -108,4 +130,10 @@ public class Traversal<C, S, E> implements Iterator<E> {
         }
         return list;
     }
+
+    @Override
+    public String toString() {
+        this.setupProcessor();
+        return this.processor.toString();
+    }
 }
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/language/TraversalSource.java 
b/java/core/src/main/java/org/apache/tinkerpop/language/TraversalSource.java
index a268330..be6df43 100644
--- a/java/core/src/main/java/org/apache/tinkerpop/language/TraversalSource.java
+++ b/java/core/src/main/java/org/apache/tinkerpop/language/TraversalSource.java
@@ -18,24 +18,31 @@
  */
 package org.apache.tinkerpop.language;
 
+import org.apache.tinkerpop.machine.coefficients.Coefficient;
+import org.apache.tinkerpop.machine.coefficients.LongCoefficient;
+import org.apache.tinkerpop.machine.compiler.Strategy;
 import org.apache.tinkerpop.machine.processor.ProcessorFactory;
-import org.apache.tinkerpop.machine.coefficients.Coefficients;
-import org.apache.tinkerpop.machine.coefficients.LongCoefficients;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
 public class TraversalSource<C> {
 
-    private Coefficients<C> coefficients = (Coefficients) new 
LongCoefficients();
+    private Coefficient<C> coefficient;
     private ProcessorFactory factory;
+    private List<Strategy> strategies = new ArrayList<>();
 
 
     protected TraversalSource() {
+        this.coefficient = (Coefficient<C>) LongCoefficient.create();
     }
 
-    public TraversalSource<C> coefficients(final Coefficients coefficients) {
-        this.coefficients = coefficients;
+    public TraversalSource<C> coefficient(final Coefficient<C> coefficient) {
+        this.coefficient = coefficient.clone();
+        this.coefficient.unity();
         return this;
     }
 
@@ -48,8 +55,13 @@ public class TraversalSource<C> {
         return this;
     }
 
+    public TraversalSource<C> strategy(final Strategy strategy) {
+        this.strategies.add(strategy);
+        return this;
+    }
+
     public <S> Traversal<C, S, S> inject(final S... objects) {
-        final Traversal<C, S, S> traversal = new 
Traversal<>(this.coefficients.unity(), this.factory);
+        final Traversal<C, S, S> traversal = new Traversal<>(this.coefficient, 
this.factory);
         return traversal.inject(objects);
     }
 }
diff --git a/java/core/src/main/java/org/apache/tinkerpop/language/__.java 
b/java/core/src/main/java/org/apache/tinkerpop/language/__.java
index 95f69f9..23fbb65 100644
--- a/java/core/src/main/java/org/apache/tinkerpop/language/__.java
+++ b/java/core/src/main/java/org/apache/tinkerpop/language/__.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.language;
 
+import org.apache.tinkerpop.machine.coefficients.LongCoefficient;
 import org.apache.tinkerpop.machine.processor.EmptyProcessorFactory;
 
 /**
@@ -26,6 +27,7 @@ import 
org.apache.tinkerpop.machine.processor.EmptyProcessorFactory;
 public class __ {
 
     public static <C> Traversal<C, Long, Long> incr() {
-        return (Traversal) new Traversal<>(1L, 
EmptyProcessorFactory.instance()).incr();
+        // this is bad -- it needs to know how to get the coefficient of the 
parent traversal
+        return (Traversal) new Traversal<>(LongCoefficient.create(), 
EmptyProcessorFactory.instance()).incr();
     }
 }
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/Bytecode.java 
b/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/Bytecode.java
index 68e91db..6b53da5 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/Bytecode.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/Bytecode.java
@@ -18,6 +18,8 @@
  */
 package org.apache.tinkerpop.machine.bytecode;
 
+import org.apache.tinkerpop.machine.coefficients.Coefficient;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -32,8 +34,9 @@ public class Bytecode<C> {
         this.instructions = new ArrayList<>();
     }
 
-    public void addInstruction(final C coefficient, final String op, final 
Object... args) {
-        this.instructions.add(new Instruction<>(coefficient, op, args));
+    public void addInstruction(final Coefficient<C> coefficient, final String 
op, final Object... args) {
+        this.instructions.add(new Instruction<>(coefficient.clone(), op, 
args));
+        coefficient.unity();
     }
 
     public List<Instruction<C>> getInstructions() {
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/BytecodeUtil.java
 
b/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/BytecodeUtil.java
index 204a7dd..8f560fb 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/BytecodeUtil.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/BytecodeUtil.java
@@ -19,6 +19,7 @@
 package org.apache.tinkerpop.machine.bytecode;
 
 import org.apache.tinkerpop.language.Symbols;
+import org.apache.tinkerpop.machine.coefficients.Coefficient;
 import org.apache.tinkerpop.machine.functions.CFunction;
 import org.apache.tinkerpop.machine.functions.filter.IdentityFilter;
 import org.apache.tinkerpop.machine.functions.filter.IsFilter;
@@ -56,7 +57,7 @@ public final class BytecodeUtil {
 
     private static <C> CFunction<C> generateFunction(final Instruction<C> 
instruction) {
         final String op = instruction.op();
-        final C coefficient = instruction.coefficient();
+        final Coefficient<C> coefficient = instruction.coefficient();
         final Set<String> labels = instruction.labels();
         switch (op) {
             case Symbols.IDENTITY:
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/Instruction.java
 
b/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/Instruction.java
index 2a5df83..5612a65 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/Instruction.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/bytecode/Instruction.java
@@ -20,6 +20,8 @@ package org.apache.tinkerpop.machine.bytecode;
 
 import org.apache.tinkerpop.language.Traversal;
 import org.apache.tinkerpop.language.TraversalUtil;
+import org.apache.tinkerpop.machine.coefficients.Coefficient;
+import org.apache.tinkerpop.util.StringFactory;
 
 import java.util.Arrays;
 import java.util.HashSet;
@@ -30,18 +32,18 @@ import java.util.Set;
  */
 public final class Instruction<C> {
 
-    private final C coefficient;
+    private final Coefficient<C> coefficient;
     private final String op;
     private Object[] args;
     private final Set<String> labels = new HashSet<>();
 
-    public Instruction(final C coefficient, final String op, final Object... 
args) {
+    public Instruction(final Coefficient<C> coefficient, final String op, 
final Object... args) {
         this.coefficient = coefficient;
         this.op = op;
         this.args = args;
     }
 
-    public C coefficient() {
+    public Coefficient<C> coefficient() {
         return this.coefficient;
     }
 
@@ -68,6 +70,6 @@ public final class Instruction<C> {
 
     @Override
     public String toString() {
-        return "[" + this.coefficient + "]" + this.op + ":" + 
Arrays.toString(this.args).replace("[", "").replace("]", "" + "@" + 
this.labels);
+        return StringFactory.makeInstructionString(this);
     }
 }
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/Coefficients.java
 
b/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/Coefficient.java
similarity index 71%
copy from 
java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/Coefficients.java
copy to 
java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/Coefficient.java
index e00694f..bfad9d3 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/Coefficients.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/Coefficient.java
@@ -21,16 +21,23 @@ package org.apache.tinkerpop.machine.coefficients;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public interface Coefficients<C> {
+public interface Coefficient<C> extends Cloneable {
 
-    public C sum(final C coefficientA, final C coefficientB);
+    public Coefficient<C> sum(final C other);
 
-    public C multiply(final C coefficientA, final C coefficientB);
+    public Coefficient<C> multiply(final C other);
 
-    public C unity();
+    public Coefficient<C> set(final C other);
 
-    public C zero();
+    public Coefficient<C> unity();
 
-    public Long count(final Long coefficient);
+    public Coefficient<C> zero();
 
+    public boolean isUnity();
+
+    public C value();
+
+    public Long count();
+
+    public Coefficient<C> clone();
 }
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/LongCoefficient.java
 
b/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/LongCoefficient.java
new file mode 100644
index 0000000..8762553
--- /dev/null
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/LongCoefficient.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.machine.coefficients;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class LongCoefficient implements Coefficient<Long> {
+
+    private Long value;
+
+    private LongCoefficient(final Long value) {
+        this.value = value;
+    }
+
+    @Override
+    public Coefficient<Long> sum(final Long other) {
+        this.value = this.value + other;
+        return this;
+    }
+
+    @Override
+    public Coefficient<Long> multiply(final Long other) {
+        this.value = this.value * other;
+        return this;
+    }
+
+    @Override
+    public Coefficient<Long> set(final Long value) {
+        this.value = value;
+        return this;
+    }
+
+    @Override
+    public Coefficient<Long> unity() {
+        this.value = 1L;
+        return this;
+    }
+
+    @Override
+    public Coefficient<Long> zero() {
+        this.value = 0L;
+        return this;
+    }
+
+    @Override
+    public boolean isUnity() {
+        return this.value == 1L;
+    }
+
+    @Override
+    public Long value() {
+        return this.value;
+    }
+
+    @Override
+    public Long count() {
+        return this.value;
+    }
+
+    @Override
+    public String toString() {
+        return this.value.toString();
+    }
+
+    @Override
+    public LongCoefficient clone() {
+        try {
+            return (LongCoefficient) super.clone();
+        } catch (final CloneNotSupportedException e) {
+            throw new RuntimeException(e.getMessage(), e);
+        }
+    }
+
+    public static LongCoefficient create(final Long coefficient) {
+        return new LongCoefficient(coefficient);
+    }
+
+    public static LongCoefficient create() {
+        return new LongCoefficient(1L);
+    }
+}
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/LongCoefficients.java
 
b/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/LongCoefficients.java
deleted file mode 100644
index 49406cf..0000000
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/LongCoefficients.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.machine.coefficients;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class LongCoefficients implements Coefficients<Long> {
-
-    private static final LongCoefficients INSTANCE = new LongCoefficients();
-
-    @Override
-    public final Long sum(final Long coefficientA, final Long coefficientB) {
-        return coefficientA + coefficientB;
-    }
-
-    @Override
-    public final Long multiply(final Long coefficientA, final Long 
coefficientB) {
-        return coefficientA * coefficientB;
-    }
-
-    @Override
-    public final Long unity() {
-        return 1L;
-    }
-
-    @Override
-    public final Long zero() {
-        return 0L;
-    }
-
-    @Override
-    public final Long count(final Long coefficient) {
-        return coefficient;
-    }
-
-    public static LongCoefficients instance() {
-        return INSTANCE;
-    }
-}
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/Coefficients.java
 b/java/core/src/main/java/org/apache/tinkerpop/machine/compiler/Strategy.java
similarity index 73%
rename from 
java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/Coefficients.java
rename to 
java/core/src/main/java/org/apache/tinkerpop/machine/compiler/Strategy.java
index e00694f..895f94b 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/coefficients/Coefficients.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/compiler/Strategy.java
@@ -16,21 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tinkerpop.machine.coefficients;
+package org.apache.tinkerpop.machine.compiler;
+
+import org.apache.tinkerpop.machine.bytecode.Bytecode;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public interface Coefficients<C> {
-
-    public C sum(final C coefficientA, final C coefficientB);
-
-    public C multiply(final C coefficientA, final C coefficientB);
-
-    public C unity();
-
-    public C zero();
-
-    public Long count(final Long coefficient);
+public interface Strategy {
 
+    public <C> void process(final Bytecode<C> bytecode);
 }
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/AbstractFunction.java
 
b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/AbstractFunction.java
index d759c97..5323696 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/AbstractFunction.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/AbstractFunction.java
@@ -18,7 +18,9 @@
  */
 package org.apache.tinkerpop.machine.functions;
 
+import org.apache.tinkerpop.machine.coefficients.Coefficient;
 import org.apache.tinkerpop.machine.traversers.Traverser;
+import org.apache.tinkerpop.util.StringFactory;
 
 import java.util.Set;
 
@@ -27,16 +29,16 @@ import java.util.Set;
  */
 public abstract class AbstractFunction<C, S, E> implements CFunction<C> {
 
-    protected final C coefficient;
+    protected final Coefficient<C> coefficient;
     private Set<String> labels;
 
-    public AbstractFunction(final C coefficient, final Set<String> labels) {
+    public AbstractFunction(final Coefficient<C> coefficient, final 
Set<String> labels) {
         this.coefficient = coefficient;
         this.labels = labels;
     }
 
     @Override
-    public C coefficient() {
+    public Coefficient<C> coefficient() {
         return this.coefficient;
     }
 
@@ -46,7 +48,8 @@ public abstract class AbstractFunction<C, S, E> implements 
CFunction<C> {
     }
 
     protected Traverser<C, E> postProcess(final Traverser<C, E> traverser) {
-        for (final String label : labels) {
+        traverser.coefficient().multiply(this.coefficient.value());
+        for (final String label : this.labels) {
             traverser.addLabel(label);
         }
         return traverser;
@@ -55,6 +58,6 @@ public abstract class AbstractFunction<C, S, E> implements 
CFunction<C> {
 
     @Override
     public String toString() {
-        return "[" + this.coefficient + "]" + this.getClass().getSimpleName() 
+ "@" + this.labels;
+        return StringFactory.makeFunctionString(this);
     }
 }
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/CFunction.java 
b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/CFunction.java
index 2c5cc18..144b77f 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/CFunction.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/CFunction.java
@@ -18,6 +18,8 @@
  */
 package org.apache.tinkerpop.machine.functions;
 
+import org.apache.tinkerpop.machine.coefficients.Coefficient;
+
 import java.util.Set;
 
 /**
@@ -25,7 +27,7 @@ import java.util.Set;
  */
 public interface CFunction<C> {
 
-    public C coefficient();
+    public Coefficient<C> coefficient();
 
     public Set<String> labels();
 
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/filter/IdentityFilter.java
 
b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/filter/IdentityFilter.java
index 42d77b7..544f674 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/filter/IdentityFilter.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/filter/IdentityFilter.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.functions.filter;
 
+import org.apache.tinkerpop.machine.coefficients.Coefficient;
 import org.apache.tinkerpop.machine.functions.AbstractFunction;
 import org.apache.tinkerpop.machine.functions.FilterFunction;
 import org.apache.tinkerpop.machine.traversers.Traverser;
@@ -29,12 +30,13 @@ import java.util.Set;
  */
 public class IdentityFilter<C, S> extends AbstractFunction<C,S,S> implements 
FilterFunction<C, S> {
 
-    public IdentityFilter(final C coefficient, final Set<String> labels) {
+    public IdentityFilter(final Coefficient<C> coefficient, final Set<String> 
labels) {
         super(coefficient, labels);
     }
 
     @Override
     public boolean test(final Traverser<C, S> traverser) {
+        super.postProcess(traverser);
         return true;
     }
 }
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/filter/IsFilter.java
 
b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/filter/IsFilter.java
index 69a64df..c0f2a98 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/filter/IsFilter.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/filter/IsFilter.java
@@ -18,9 +18,11 @@
  */
 package org.apache.tinkerpop.machine.functions.filter;
 
+import org.apache.tinkerpop.machine.coefficients.Coefficient;
 import org.apache.tinkerpop.machine.functions.AbstractFunction;
 import org.apache.tinkerpop.machine.functions.FilterFunction;
 import org.apache.tinkerpop.machine.traversers.Traverser;
+import org.apache.tinkerpop.util.StringFactory;
 
 import java.util.Set;
 
@@ -31,18 +33,19 @@ public class IsFilter<C, S> extends AbstractFunction<C, S, 
S> implements FilterF
 
     private final S object;
 
-    public IsFilter(final C coefficient, final Set<String> labels, final S 
object) {
+    public IsFilter(final Coefficient<C> coefficient, final Set<String> 
labels, final S object) {
         super(coefficient, labels);
         this.object = object;
     }
 
     @Override
     public boolean test(final Traverser<C, S> traverser) {
+        super.postProcess(traverser);
         return traverser.object().equals(this.object);
     }
 
     @Override
     public String toString() {
-        return "[" + this.coefficient + "]" + this.getClass().getSimpleName() 
+ ":" + this.object;
+        return StringFactory.makeFunctionString(this, this.object);
     }
 }
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/initial/InjectInitial.java
 
b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/initial/InjectInitial.java
index 93f5d86..de93cc5 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/initial/InjectInitial.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/initial/InjectInitial.java
@@ -18,11 +18,12 @@
  */
 package org.apache.tinkerpop.machine.functions.initial;
 
+import org.apache.tinkerpop.machine.coefficients.Coefficient;
 import org.apache.tinkerpop.machine.functions.AbstractFunction;
 import org.apache.tinkerpop.machine.functions.InitialFunction;
 import org.apache.tinkerpop.machine.traversers.Traverser;
+import org.apache.tinkerpop.util.StringFactory;
 
-import java.util.Arrays;
 import java.util.Iterator;
 import java.util.Set;
 import java.util.stream.Stream;
@@ -34,18 +35,18 @@ public class InjectInitial<C, S> extends 
AbstractFunction<C, S, S> implements In
 
     private final S[] objects;
 
-    public InjectInitial(final C coefficient, final Set<String> labels, final 
S... objects) {
+    public InjectInitial(final Coefficient<C> coefficient, final Set<String> 
labels, final S... objects) {
         super(coefficient, labels);
         this.objects = objects;
     }
 
     @Override
     public Iterator<Traverser<C, S>> get() {
-        return Stream.of(this.objects).map(a -> new 
Traverser<>(this.coefficient, a)).iterator();
+        return Stream.of(this.objects).map(object -> new 
Traverser<>(this.coefficient.clone(), object)).iterator();
     }
 
     @Override
     public String toString() {
-        return "[" + this.coefficient + "]" + this.getClass().getSimpleName() 
+ ":" + Arrays.toString(this.objects);
+        return StringFactory.makeFunctionString(this, this.objects);
     }
 }
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/IncrMap.java
 
b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/IncrMap.java
index f0eb939..1e5964f 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/IncrMap.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/IncrMap.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.functions.map;
 
+import org.apache.tinkerpop.machine.coefficients.Coefficient;
 import org.apache.tinkerpop.machine.functions.AbstractFunction;
 import org.apache.tinkerpop.machine.functions.MapFunction;
 import org.apache.tinkerpop.machine.traversers.Traverser;
@@ -29,12 +30,12 @@ import java.util.Set;
  */
 public class IncrMap<C> extends AbstractFunction<C, Long, Long> implements 
MapFunction<C, Long, Long> {
 
-    public IncrMap(final C coefficient, final Set<String> labels) {
+    public IncrMap(final Coefficient<C> coefficient, final Set<String> labels) 
{
         super(coefficient, labels);
     }
 
     @Override
     public Traverser<C, Long> apply(final Traverser<C, Long> traverser) {
-        return postProcess(traverser.split(traverser.coefficient(), 
traverser.object() + 1));
+        return postProcess(traverser.split(traverser.object() + 1));
     }
 }
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/MapMap.java
 
b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/MapMap.java
index 7d8a7bc..f3681b6 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/MapMap.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/MapMap.java
@@ -18,12 +18,14 @@
  */
 package org.apache.tinkerpop.machine.functions.map;
 
-import org.apache.tinkerpop.machine.processor.Processor;
+import org.apache.tinkerpop.machine.coefficients.Coefficient;
 import org.apache.tinkerpop.machine.functions.AbstractFunction;
 import org.apache.tinkerpop.machine.functions.CFunction;
 import org.apache.tinkerpop.machine.functions.MapFunction;
 import org.apache.tinkerpop.machine.functions.NestedFunction;
+import org.apache.tinkerpop.machine.processor.Processor;
 import org.apache.tinkerpop.machine.traversers.Traverser;
+import org.apache.tinkerpop.util.StringFactory;
 
 import java.util.List;
 import java.util.Set;
@@ -31,12 +33,12 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class MapMap<C, S, E> extends AbstractFunction<C,S,E> implements 
MapFunction<C, S, E>, NestedFunction<C, S, E> {
+public class MapMap<C, S, E> extends AbstractFunction<C, S, E> implements 
MapFunction<C, S, E>, NestedFunction<C, S, E> {
 
     private final List<CFunction<C>> mapFunctions;
     private Processor<C, S, E> processor;
 
-    public MapMap(final C coefficient, final Set<String> labels, final 
List<CFunction<C>> mapFunctions) {
+    public MapMap(final Coefficient<C> coefficient, final Set<String> labels, 
final List<CFunction<C>> mapFunctions) {
         super(coefficient, labels);
         this.mapFunctions = mapFunctions;
     }
@@ -45,7 +47,7 @@ public class MapMap<C, S, E> extends AbstractFunction<C,S,E> 
implements MapFunct
     public Traverser<C, E> apply(final Traverser<C, S> traverser) {
         this.processor.reset();
         this.processor.addStart(traverser);
-        return traverser.split(this.coefficient, 
this.processor.nextTraverser().object());
+        return 
super.postProcess(traverser.split(this.processor.next().object()));
     }
 
     public void setProcessor(final Processor<C, S, E> processor) {
@@ -58,6 +60,6 @@ public class MapMap<C, S, E> extends AbstractFunction<C,S,E> 
implements MapFunct
 
     @Override
     public String toString() {
-        return super.toString() + this.processor;
+        return StringFactory.makeFunctionString(this, 
this.mapFunctions.toArray());
     }
 }
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/PathMap.java
 
b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/PathMap.java
index a8ee4e7..051d647 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/PathMap.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/functions/map/PathMap.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.machine.functions.map;
 
+import org.apache.tinkerpop.machine.coefficients.Coefficient;
 import org.apache.tinkerpop.machine.functions.AbstractFunction;
 import org.apache.tinkerpop.machine.functions.MapFunction;
 import org.apache.tinkerpop.machine.traversers.Path;
@@ -30,12 +31,12 @@ import java.util.Set;
  */
 public class PathMap<C, S> extends AbstractFunction<C, S, Path> implements 
MapFunction<C, S, Path> {
 
-    public PathMap(final C coefficient, final Set<String> labels) {
+    public PathMap(final Coefficient<C> coefficient, final Set<String> labels) 
{
         super(coefficient, labels);
     }
 
     @Override
     public Traverser<C, Path> apply(final Traverser<C, S> traverser) {
-        return traverser.split(this.coefficient, traverser.path());
+        return super.postProcess(traverser.split(traverser.path()));
     }
 }
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/processor/EmptyProcessor.java
 
b/java/core/src/main/java/org/apache/tinkerpop/machine/processor/EmptyProcessor.java
index e22ab3e..9b89efd 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/processor/EmptyProcessor.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/processor/EmptyProcessor.java
@@ -19,7 +19,7 @@
 package org.apache.tinkerpop.machine.processor;
 
 import org.apache.tinkerpop.machine.traversers.Traverser;
-import org.apache.tinkerpop.machine.util.FastNoSuchElementException;
+import org.apache.tinkerpop.util.FastNoSuchElementException;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -37,12 +37,12 @@ public class EmptyProcessor<C, S, E> implements 
Processor<C, S, E> {
     }
 
     @Override
-    public Traverser<C, E> nextTraverser() {
+    public Traverser<C, E> next() {
         throw FastNoSuchElementException.instance();
     }
 
     @Override
-    public boolean hasNextTraverser() {
+    public boolean hasNext() {
         return false;
     }
 
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/processor/Processor.java 
b/java/core/src/main/java/org/apache/tinkerpop/machine/processor/Processor.java
index 09fe2b7..a65c9da 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/processor/Processor.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/processor/Processor.java
@@ -20,16 +20,18 @@ package org.apache.tinkerpop.machine.processor;
 
 import org.apache.tinkerpop.machine.traversers.Traverser;
 
+import java.util.Iterator;
+
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public interface Processor<C, S, E> {
+public interface Processor<C, S, E> extends Iterator<Traverser<C, E>> {
 
     public void addStart(final Traverser<C, S> traverser);
 
-    public Traverser<C, E> nextTraverser();
+    public Traverser<C, E> next();
 
-    public boolean hasNextTraverser();
+    public boolean hasNext();
 
     public void reset();
 }
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/Traverser.java
 
b/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/Traverser.java
index f7a94e3..4d2e92a 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/Traverser.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/Traverser.java
@@ -18,6 +18,8 @@
  */
 package org.apache.tinkerpop.machine.traversers;
 
+import org.apache.tinkerpop.machine.coefficients.Coefficient;
+
 import java.util.Collections;
 import java.util.HashSet;
 
@@ -26,16 +28,16 @@ import java.util.HashSet;
  */
 public class Traverser<C, S> {
 
-    private final C coefficient;
+    private final Coefficient<C> coefficient;
     private final S object;
     private Path path = new Path();
 
-    public Traverser(final C coefficient, final S object) {
+    public Traverser(final Coefficient<C> coefficient, final S object) {
         this.coefficient = coefficient;
         this.object = object;
     }
 
-    public C coefficient() {
+    public Coefficient<C> coefficient() {
         return this.coefficient;
     }
 
@@ -51,8 +53,8 @@ public class Traverser<C, S> {
         this.path.addLabels(Collections.singleton(label));
     }
 
-    public <B> Traverser<C, B> split(final C coefficient, final B object) {
-        final Traverser<C, B> traverser = new Traverser<>(coefficient, object);
+    public <B> Traverser<C, B> split(final B object) {
+        final Traverser<C, B> traverser = new 
Traverser<>(this.coefficient.clone(), object);
         traverser.path = new Path(this.path);
         traverser.path.add(new HashSet<>(), object);
         return traverser;
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/TraverserSet.java
 
b/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/TraverserSet.java
index 90241f9..a7c011b 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/TraverserSet.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/TraverserSet.java
@@ -19,7 +19,7 @@
 package org.apache.tinkerpop.machine.traversers;
 
 
-import org.apache.tinkerpop.machine.util.FastNoSuchElementException;
+import org.apache.tinkerpop.util.FastNoSuchElementException;
 
 import java.util.AbstractSet;
 import java.util.Collections;
@@ -61,12 +61,11 @@ public class TraverserSet<C, S> extends 
AbstractSet<Traverser<C, S>> implements
     }
 
     public long bulkSize() {
-        /*long bulk = 0L;
-        for (final Traverser<C,S> traverser : this.map.values()) {
-            bulk = bulk + traverser.bulk();
+        long bulk = 0L;
+        for (final Traverser<C, S> traverser : this.map.values()) {
+            bulk = bulk + traverser.coefficient().count();
         }
-        return bulk;*/
-        return 1L;
+        return bulk;
     }
 
     @Override
@@ -86,7 +85,7 @@ public class TraverserSet<C, S> extends 
AbstractSet<Traverser<C, S>> implements
             this.map.put(traverser, traverser);
             return true;
         } else {
-            //existing.
+            existing.coefficient().sum(traverser.coefficient().value());
             return false;
         }
     }
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/util/FastNoSuchElementException.java
 
b/java/core/src/main/java/org/apache/tinkerpop/util/FastNoSuchElementException.java
similarity index 97%
rename from 
java/core/src/main/java/org/apache/tinkerpop/machine/util/FastNoSuchElementException.java
rename to 
java/core/src/main/java/org/apache/tinkerpop/util/FastNoSuchElementException.java
index 88bcaa4..0903c93 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/util/FastNoSuchElementException.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/util/FastNoSuchElementException.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tinkerpop.machine.util;
+package org.apache.tinkerpop.util;
 
 import java.util.NoSuchElementException;
 
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/util/StringFactory.java 
b/java/core/src/main/java/org/apache/tinkerpop/util/StringFactory.java
new file mode 100644
index 0000000..9679e23
--- /dev/null
+++ b/java/core/src/main/java/org/apache/tinkerpop/util/StringFactory.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.util;
+
+import org.apache.tinkerpop.machine.bytecode.Instruction;
+import org.apache.tinkerpop.machine.functions.CFunction;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class StringFactory {
+
+    private StringFactory() {
+        // do nothing
+    }
+
+    public static String makeInstructionString(final Instruction<?> 
instruction) {
+        String name = instruction.op();
+        if (!instruction.coefficient().isUnity())
+            name = "|" + instruction.coefficient().value() + "|" + name;
+        if (instruction.args().length > 0)
+            name = name + "(";
+        for (final Object object : instruction.args()) {
+            name = name + object + ",";
+        }
+        if (instruction.args().length > 0) {
+            name = name.substring(0, name.length() - 1);
+            name = name + ")";
+        }
+        if (!instruction.labels().isEmpty())
+            name = name + "@" + instruction.labels();
+        return name;
+    }
+
+    public static String makeFunctionString(final CFunction<?> function, final 
Object... args) {
+        String name = function.getClass().getSimpleName();
+        if (!function.coefficient().isUnity())
+            name = "|" + function.coefficient().value() + "|" + name;
+        if (args.length > 0)
+            name = name + "(";
+        for (final Object object : args) {
+            name = name + object + ",";
+        }
+        if (args.length > 0) {
+            name = name.substring(0, name.length() - 1);
+            name = name + ")";
+        }
+        if (!function.labels().isEmpty())
+            name = name + "@" + function.labels();
+        return name;
+    }
+}
diff --git 
a/java/core/src/test/java/org/apache/tinkerpop/machine/TraversalTest.java 
b/java/core/src/test/java/org/apache/tinkerpop/machine/TraversalTest.java
index 0b0c7ba..a82ac84 100644
--- a/java/core/src/test/java/org/apache/tinkerpop/machine/TraversalTest.java
+++ b/java/core/src/test/java/org/apache/tinkerpop/machine/TraversalTest.java
@@ -22,7 +22,7 @@ import org.apache.tinkerpop.language.Gremlin;
 import org.apache.tinkerpop.language.Traversal;
 import org.apache.tinkerpop.language.TraversalSource;
 import org.apache.tinkerpop.language.__;
-import org.apache.tinkerpop.machine.coefficients.LongCoefficients;
+import org.apache.tinkerpop.machine.coefficients.LongCoefficient;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -33,7 +33,7 @@ public class TraversalTest {
     @Test
     public void shouldHaveBytecode() throws Exception {
         TraversalSource<Long> g = Gremlin.traversal();
-        g = g.coefficients(LongCoefficients.instance());
+        g = g.coefficient(LongCoefficient.create());
         final Traversal<Long, Long, Long> traversal = 
g.inject(7L).is(7L).incr().as("a").is(8L).by(__.incr());
         //System.out.println(traversal.bytecode);
         //System.out.println(BytecodeUtil.compile(traversal.getBytecode()));
diff --git 
a/java/core/src/test/java/org/apache/tinkerpop/machine/compiler/BytecodeUtilTest.java
 
b/java/core/src/test/java/org/apache/tinkerpop/machine/compiler/BytecodeUtilTest.java
index 51b819e..cc438f5 100644
--- 
a/java/core/src/test/java/org/apache/tinkerpop/machine/compiler/BytecodeUtilTest.java
+++ 
b/java/core/src/test/java/org/apache/tinkerpop/machine/compiler/BytecodeUtilTest.java
@@ -19,8 +19,8 @@
 package org.apache.tinkerpop.machine.compiler;
 
 import org.apache.tinkerpop.language.Traversal;
+import org.apache.tinkerpop.machine.coefficients.LongCoefficient;
 import org.apache.tinkerpop.machine.processor.EmptyProcessorFactory;
-import org.apache.tinkerpop.machine.bytecode.BytecodeUtil;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -30,7 +30,7 @@ public class BytecodeUtilTest {
 
     @Test
     public void shouldHaveBytecode() throws Exception {
-        final Traversal<Long, Long, Long> traversal = new Traversal<>(1L, 
EmptyProcessorFactory.instance());
+        final Traversal<Long, Long, Long> traversal = new 
Traversal<>(LongCoefficient.create(), EmptyProcessorFactory.instance());
         traversal.incr().is(2L);
         //System.out.println(traversal.bytecode);
         //System.out.println(BytecodeUtil.compile(traversal.getBytecode()));
diff --git 
a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/AbstractStep.java
 
b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/AbstractStep.java
index 2103b96..3136c38 100644
--- 
a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/AbstractStep.java
+++ 
b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/AbstractStep.java
@@ -21,7 +21,6 @@ package org.apache.tinkerpop.machine.pipes;
 import org.apache.tinkerpop.machine.functions.CFunction;
 import org.apache.tinkerpop.machine.traversers.Traverser;
 import org.apache.tinkerpop.machine.traversers.TraverserSet;
-import org.apache.tinkerpop.machine.util.FastNoSuchElementException;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -37,7 +36,7 @@ public abstract class AbstractStep<C, S, E> implements 
Step<C, S, E> {
         this.function = function;
     }
 
-    public void addTraverser(final Traverser<C, S> traverser) {
+    public void addStart(final Traverser<C, S> traverser) {
         this.traverserSet.add(traverser);
     }
 
@@ -52,10 +51,13 @@ public abstract class AbstractStep<C, S, E> implements 
Step<C, S, E> {
     protected Traverser<C, S> processNextTraverser() {
         if (!this.traverserSet.isEmpty())
             return this.traverserSet.remove();
-        else if (this.previousStep.hasNext())
-            return this.previousStep.next();
         else
-            throw FastNoSuchElementException.instance();
+            return this.previousStep.next();
+    }
+
+    @Override
+    public void reset() {
+        this.traverserSet.clear();
     }
 
     @Override
diff --git 
a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/EmptyStep.java
 
b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/EmptyStep.java
index a8963ac..c1dff07 100644
--- 
a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/EmptyStep.java
+++ 
b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/EmptyStep.java
@@ -19,7 +19,7 @@
 package org.apache.tinkerpop.machine.pipes;
 
 import org.apache.tinkerpop.machine.traversers.Traverser;
-import org.apache.tinkerpop.machine.util.FastNoSuchElementException;
+import org.apache.tinkerpop.util.FastNoSuchElementException;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
diff --git 
a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/InitialStep.java
 
b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/InitialStep.java
index 37bf186..31d3c3e 100644
--- 
a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/InitialStep.java
+++ 
b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/InitialStep.java
@@ -21,6 +21,7 @@ package org.apache.tinkerpop.machine.pipes;
 import org.apache.tinkerpop.machine.functions.InitialFunction;
 import org.apache.tinkerpop.machine.traversers.Traverser;
 
+import java.util.Collections;
 import java.util.Iterator;
 
 /**
@@ -28,7 +29,7 @@ import java.util.Iterator;
  */
 public class InitialStep<C, S> extends AbstractStep<C, S, S> {
 
-    private final Iterator<Traverser<C, S>> objects;
+    private Iterator<Traverser<C, S>> objects;
 
     public InitialStep(final InitialFunction<C, S> initialFunction) {
         super(EmptyStep.instance(), initialFunction);
@@ -45,4 +46,10 @@ public class InitialStep<C, S> extends AbstractStep<C, S, S> 
{
         return this.objects.next();
     }
 
+    @Override
+    public void reset() {
+        super.reset();
+        this.objects = Collections.emptyIterator();
+    }
+
 }
diff --git 
a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/Pipes.java
 
b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/Pipes.java
index c7a57eb..bc5028d 100644
--- 
a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/Pipes.java
+++ 
b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/Pipes.java
@@ -18,7 +18,6 @@
  */
 package org.apache.tinkerpop.machine.pipes;
 
-import org.apache.tinkerpop.machine.processor.Processor;
 import org.apache.tinkerpop.machine.bytecode.Bytecode;
 import org.apache.tinkerpop.machine.bytecode.BytecodeUtil;
 import org.apache.tinkerpop.machine.functions.CFunction;
@@ -26,18 +25,18 @@ import 
org.apache.tinkerpop.machine.functions.FilterFunction;
 import org.apache.tinkerpop.machine.functions.InitialFunction;
 import org.apache.tinkerpop.machine.functions.MapFunction;
 import org.apache.tinkerpop.machine.functions.NestedFunction;
+import org.apache.tinkerpop.machine.processor.Processor;
 import org.apache.tinkerpop.machine.traversers.Traverser;
 
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class Pipes<C, S, E> implements Iterator<E>, Processor<C, S, E> {
+public class Pipes<C, S, E> implements Processor<C, S, E> {
 
-    private final List<AbstractStep<?, ?, ?>> steps = new ArrayList<>();
+    private final List<Step<?, ?, ?>> steps = new ArrayList<>();
     private Step<C, ?, E> endStep;
     private Step<C, S, ?> startStep = EmptyStep.instance();
 
@@ -70,42 +69,25 @@ public class Pipes<C, S, E> implements Iterator<E>, 
Processor<C, S, E> {
     }
 
     @Override
-    public boolean hasNext() {
-        return this.endStep.hasNext();
-    }
-
-    @Override
-    public E next() {
-        return this.endStep.next().object();
-    }
-
-    public List<E> toList() {
-        final List<E> list = new ArrayList<>();
-        while (this.hasNext()) {
-            list.add(this.next());
-        }
-        return list;
-    }
-
-    @Override
     public void addStart(final Traverser<C, S> traverser) {
-        this.startStep.addTraverser(traverser);
+        this.startStep.addStart(traverser);
     }
 
     @Override
-    public Traverser<C, E> nextTraverser() {
+    public Traverser<C, E> next() {
         return this.endStep.next();
     }
 
     @Override
-    public boolean hasNextTraverser() {
+    public boolean hasNext() {
         return this.endStep.hasNext();
     }
 
     @Override
     public void reset() {
-        while (hasNext())
-            next();
+        for (final Step<?, ?, ?> step : this.steps) {
+            step.reset();
+        }
     }
 
     @Override
diff --git 
a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/Step.java 
b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/Step.java
index a24d037..ce801a5 100644
--- 
a/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/Step.java
+++ 
b/java/machine/pipes/src/main/java/org/apache/tinkerpop/machine/pipes/Step.java
@@ -27,7 +27,7 @@ import java.util.Iterator;
  */
 public interface Step<C, S, E> extends Iterator<Traverser<C, E>> {
 
-    public void addTraverser(final Traverser<C, S> traverser);
+    public void addStart(final Traverser<C, S> traverser);
 
-    // public void reset();
+    public void reset();
 }
diff --git 
a/java/machine/pipes/src/test/java/org/apache/tinkerpop/machine/pipes/PipesTest.java
 
b/java/machine/pipes/src/test/java/org/apache/tinkerpop/machine/pipes/PipesTest.java
index e102e6c..38d0df1 100644
--- 
a/java/machine/pipes/src/test/java/org/apache/tinkerpop/machine/pipes/PipesTest.java
+++ 
b/java/machine/pipes/src/test/java/org/apache/tinkerpop/machine/pipes/PipesTest.java
@@ -19,10 +19,11 @@
 package org.apache.tinkerpop.machine.pipes;
 
 import org.apache.tinkerpop.language.Gremlin;
+import org.apache.tinkerpop.language.Traversal;
 import org.apache.tinkerpop.language.TraversalSource;
 import org.apache.tinkerpop.language.TraversalUtil;
 import org.apache.tinkerpop.language.__;
-import org.apache.tinkerpop.machine.coefficients.LongCoefficients;
+import org.apache.tinkerpop.machine.coefficients.LongCoefficient;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -33,9 +34,11 @@ public class PipesTest {
     @Test
     public void shouldWork() {
         final TraversalSource<Long> g = Gremlin.<Long>traversal()
-                .coefficients(LongCoefficients.instance())
+                .coefficient(LongCoefficient.create())
                 .processor(PipesProcessor.class);
-        System.out.println(g.inject(7L, 10L, 
12L).map(__.incr()).identity().toList());
-        System.out.println(TraversalUtil.getBytecode(g.inject(7L, 10L, 
12L).map(__.incr()).identity()));
+        final Traversal<Long, Long, Long> traversal = g.inject(7L, 10L, 
12L).as("a").c(3L).map(__.incr()).identity().incr();
+        System.out.println(TraversalUtil.getBytecode(traversal));
+        System.out.println(traversal);
+        System.out.println(traversal.toList());
     }
 }

Reply via email to