// Path: src/main/java/com/ccnode/codegenerator/pojo/ListInfo.java
// public class ListInfo<T> {
// 
//     private List<T> fullList;
//     private List<T> selectSegments;
//     int startPos; //include
//     int endPos; //exclude
//     private List<T> newSegments;
//     private List<T> newList;
// 
//     public List<T> getFullList() {
//         return fullList;
//     }
// 
//     public void setFullList(List<T> fullList) {
//         this.fullList = fullList;
//     }
// 
//     public List<T> getSelectSegments() {
//         return selectSegments;
//     }
// 
//     public void setSelectSegments(List<T> selectSegments) {
//         this.selectSegments = selectSegments;
//     }
// 
//     public int getStartPos() {
//         return startPos;
//     }
// 
//     public void setStartPos(int startPos) {
//         this.startPos = startPos;
//     }
// 
//     public int getEndPos() {
//         return endPos;
//     }
// 
//     public void setEndPos(int endPos) {
//         this.endPos = endPos;
//     }
// 
//     public List<T> getNewSegments() {
//         return newSegments;
//     }
// 
//     public void setNewSegments(List<T> newSegments) {
//         this.newSegments = newSegments;
//     }
// 
//     public List<T> getNewList() {
//         return newList;
//     }
// 
//     public void setNewList(List<T> newList) {
//         this.newList = newList;
//     }
// 
//     public void setPos(Pair<Integer,Integer> pos) {
//         this.startPos = pos.getLeft();
//         this.endPos = pos.getRight();
//         this.selectSegments = fullList.subList(startPos,endPos);
//     }
// }
// 
// Path: src/main/java/com/ccnode/codegenerator/function/EqualCondition.java
// public interface EqualCondition<T> {
// 
//     public boolean isEqual( T t, T t2 );
// 
// }
// 
// Path: src/main/java/com/ccnode/codegenerator/pojo/ListInfo.java
// public class ListInfo<T> {
// 
//     private List<T> fullList;
//     private List<T> selectSegments;
//     int startPos; //include
//     int endPos; //exclude
//     private List<T> newSegments;
//     private List<T> newList;
// 
//     public List<T> getFullList() {
//         return fullList;
//     }
// 
//     public void setFullList(List<T> fullList) {
//         this.fullList = fullList;
//     }
// 
//     public List<T> getSelectSegments() {
//         return selectSegments;
//     }
// 
//     public void setSelectSegments(List<T> selectSegments) {
//         this.selectSegments = selectSegments;
//     }
// 
//     public int getStartPos() {
//         return startPos;
//     }
// 
//     public void setStartPos(int startPos) {
//         this.startPos = startPos;
//     }
// 
//     public int getEndPos() {
//         return endPos;
//     }
// 
//     public void setEndPos(int endPos) {
//         this.endPos = endPos;
//     }
// 
//     public List<T> getNewSegments() {
//         return newSegments;
//     }
// 
//     public void setNewSegments(List<T> newSegments) {
//         this.newSegments = newSegments;
//     }
// 
//     public List<T> getNewList() {
//         return newList;
//     }
// 
//     public void setNewList(List<T> newList) {
//         this.newList = newList;
//     }
// 
//     public void setPos(Pair<Integer,Integer> pos) {
//         this.startPos = pos.getLeft();
//         this.endPos = pos.getRight();
//         this.selectSegments = fullList.subList(startPos,endPos);
//     }
// }


import com.ccnode.codegenerator.pojo.ListInfo;
import com.ccnode.codegenerator.function.EqualCondition;
import com.ccnode.codegenerator.pojo.ListInfo;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.jetbrains.annotations.Nullable;
import java.util.List;
package com.ccnode.codegenerator.util;



/**
 * What always stop you is what you always believe.
 * <p>
 * Created by zhengjun.du on 2016/05/29 15:20
 */
public class ReplaceUtil {

    public static <T> Pair<Integer,Integer>  getPos(List<T> oldList, T start, T end, EqualCondition condition){
        int startPos = -1;
        int endPos = -1;
        int index  = 0;
        for (T t : oldList) {
            if(startPos == -1 && condition.isEqual(t, start)){
                startPos = index;
            }
            if(startPos >= 0 && condition.isEqual(t, end)){
                endPos = index + 1;
                return Pair.of(startPos,endPos);
            }
            index ++;
        }
        return Pair.of(oldList.size() - 1,oldList.size() - 1);
    }

// Path: src/main/java/com/ccnode/codegenerator/pojo/ListInfo.java
// public class ListInfo<T> {
// 
//     private List<T> fullList;
//     private List<T> selectSegments;
//     int startPos; //include
//     int endPos; //exclude
//     private List<T> newSegments;
//     private List<T> newList;
// 
//     public List<T> getFullList() {
//         return fullList;
//     }
// 
//     public void setFullList(List<T> fullList) {
//         this.fullList = fullList;
//     }
// 
//     public List<T> getSelectSegments() {
//         return selectSegments;
//     }
// 
//     public void setSelectSegments(List<T> selectSegments) {
//         this.selectSegments = selectSegments;
//     }
// 
//     public int getStartPos() {
//         return startPos;
//     }
// 
//     public void setStartPos(int startPos) {
//         this.startPos = startPos;
//     }
// 
//     public int getEndPos() {
//         return endPos;
//     }
// 
//     public void setEndPos(int endPos) {
//         this.endPos = endPos;
//     }
// 
//     public List<T> getNewSegments() {
//         return newSegments;
//     }
// 
//     public void setNewSegments(List<T> newSegments) {
//         this.newSegments = newSegments;
//     }
// 
//     public List<T> getNewList() {
//         return newList;
//     }
// 
//     public void setNewList(List<T> newList) {
//         this.newList = newList;
//     }
// 
//     public void setPos(Pair<Integer,Integer> pos) {
//         this.startPos = pos.getLeft();
//         this.endPos = pos.getRight();
//         this.selectSegments = fullList.subList(startPos,endPos);
//     }
// }
// 
// Path: src/main/java/com/ccnode/codegenerator/function/EqualCondition.java
// public interface EqualCondition<T> {
// 
//     public boolean isEqual( T t, T t2 );
// 
// }
// 
// Path: src/main/java/com/ccnode/codegenerator/pojo/ListInfo.java
// public class ListInfo<T> {
// 
//     private List<T> fullList;
//     private List<T> selectSegments;
//     int startPos; //include
//     int endPos; //exclude
//     private List<T> newSegments;
//     private List<T> newList;
// 
//     public List<T> getFullList() {
//         return fullList;
//     }
// 
//     public void setFullList(List<T> fullList) {
//         this.fullList = fullList;
//     }
// 
//     public List<T> getSelectSegments() {
//         return selectSegments;
//     }
// 
//     public void setSelectSegments(List<T> selectSegments) {
//         this.selectSegments = selectSegments;
//     }
// 
//     public int getStartPos() {
//         return startPos;
//     }
// 
//     public void setStartPos(int startPos) {
//         this.startPos = startPos;
//     }
// 
//     public int getEndPos() {
//         return endPos;
//     }
// 
//     public void setEndPos(int endPos) {
//         this.endPos = endPos;
//     }
// 
//     public List<T> getNewSegments() {
//         return newSegments;
//     }
// 
//     public void setNewSegments(List<T> newSegments) {
//         this.newSegments = newSegments;
//     }
// 
//     public List<T> getNewList() {
//         return newList;
//     }
// 
//     public void setNewList(List<T> newList) {
//         this.newList = newList;
//     }
// 
//     public void setPos(Pair<Integer,Integer> pos) {
//         this.startPos = pos.getLeft();
//         this.endPos = pos.getRight();
//         this.selectSegments = fullList.subList(startPos,endPos);
//     }
// }


// Path: src/main/java/com/ccnode/codegenerator/util/ReplaceUtil.java
import com.ccnode.codegenerator.pojo.ListInfo;
import com.ccnode.codegenerator.function.EqualCondition;
import com.ccnode.codegenerator.pojo.ListInfo;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.jetbrains.annotations.Nullable;
import java.util.List;

package com.ccnode.codegenerator.util;



/**
 * What always stop you is what you always believe.
 * <p>
 * Created by zhengjun.du on 2016/05/29 15:20
 */
public class ReplaceUtil {

    public static <T> Pair<Integer,Integer>  getPos(List<T> oldList, T start, T end, EqualCondition condition){
        int startPos = -1;
        int endPos = -1;
        int index  = 0;
        for (T t : oldList) {
            if(startPos == -1 && condition.isEqual(t, start)){
                startPos = index;
            }
            if(startPos >= 0 && condition.isEqual(t, end)){
                endPos = index + 1;
                return Pair.of(startPos,endPos);
            }
            index ++;
        }
        return Pair.of(oldList.size() - 1,oldList.size() - 1);
    }

    public static <T> void merge(ListInfo<T> listInfo, EqualCondition condition) {