From 8dc523faab4899942ff49eae3f6af8dcee4912ee Mon Sep 17 00:00:00 2001
From: Peter Powers <pmpowers@usgs.gov>
Date: Wed, 12 Apr 2017 09:11:39 -0600
Subject: [PATCH] added trim() to XySequence

---
 src/org/opensha2/data/Data.java                | 18 ++++++++++++++++++
 src/org/opensha2/data/ImmutableXySequence.java | 11 +++++++++++
 src/org/opensha2/data/XySequence.java          | 10 ++++++++++
 3 files changed, 39 insertions(+)

diff --git a/src/org/opensha2/data/Data.java b/src/org/opensha2/data/Data.java
index b32430b3d..8a074a39f 100644
--- a/src/org/opensha2/data/Data.java
+++ b/src/org/opensha2/data/Data.java
@@ -1447,4 +1447,22 @@ public final class Data {
   // checkArgument(expression, "value");
   // }
 
+  static int firstNonZeroIndex(double... data) {
+    for (int i=0; i<data.length; i++) {
+      if (data[i] != 0.0) {
+        return i;
+      }
+    }
+    return -1;
+  }
+  
+  static int lastNonZeroIndex(double... data) {
+    for (int i=data.length-1; i>=0; i--) {
+      if (data[i] != 0.0) {
+        return i;
+      }
+    }
+    return -1;
+  }
+
 }
diff --git a/src/org/opensha2/data/ImmutableXySequence.java b/src/org/opensha2/data/ImmutableXySequence.java
index 7781dec7c..f3d8f96a4 100644
--- a/src/org/opensha2/data/ImmutableXySequence.java
+++ b/src/org/opensha2/data/ImmutableXySequence.java
@@ -2,6 +2,7 @@ package org.opensha2.data;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkElementIndex;
+import static com.google.common.base.Preconditions.checkState;
 
 import java.util.Arrays;
 
@@ -65,6 +66,16 @@ class ImmutableXySequence extends XySequence {
   public final boolean isClear() {
     return Data.areZeroValued(ys);
   }
+  
+  @Override
+  public final XySequence trim() {
+    checkState(!this.isClear(), "XySequence.trim() not permitted for 'clear' sequences");
+    int minIndex = Data.firstNonZeroIndex(ys);
+    int maxIndex = Data.lastNonZeroIndex(ys) + 1;
+    return new ImmutableXySequence(
+        Arrays.copyOfRange(xs, minIndex, maxIndex),
+        Arrays.copyOfRange(ys, minIndex, maxIndex));
+  }
 
   @Override
   public final boolean equals(Object obj) {
diff --git a/src/org/opensha2/data/XySequence.java b/src/org/opensha2/data/XySequence.java
index a58ea154f..0ed827b98 100644
--- a/src/org/opensha2/data/XySequence.java
+++ b/src/org/opensha2/data/XySequence.java
@@ -506,6 +506,16 @@ public abstract class XySequence implements Iterable<XyPoint> {
    */
   public abstract boolean isClear();
 
+  /**
+   * Returns a new, immutable sequence that has had all leading and trailing
+   * zero-valued points ({@code y = 0}) removed. Any zero-valued points in the
+   * middle of this sequence are ignored.
+   * 
+   * @throws IllegalStateException if {@link #isClear() this.isClear()} as empty
+   *         sequences are not permitted
+   */
+  public abstract XySequence trim();
+
   /**
    * Transforms all y-values in place using the supplied {@link Function}.
    *
-- 
GitLab