view src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultNodePath.java @ 172:809f813d1083

minner change
author one
date Tue, 10 Feb 2015 11:28:39 +0900
parents b998fdc99bc0
children
line wrap: on
line source

package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl;

import java.util.Iterator;

import fj.F;
import fj.data.List;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair;

public class DefaultNodePath implements NodePath
{
	private final List<Integer> path;
	
	public static void main(String args[])
	{
		DefaultNodePath p = new DefaultNodePath();
		p = p.add(1).add(2).add(3).add(4);
		System.out.println(p.toString());
	}
	
	public DefaultNodePath()
	{
		path = List.list(-1);
	}
	
	private DefaultNodePath(List<Integer> path)
	{
		this.path = path;
	}

	@Override
	public Iterator<Integer> iterator()
	{
		return path.iterator();
	}

	@Override
	public DefaultNodePath add(int pos)
	{
		List<Integer> newPath = path.snoc(pos);
		return new DefaultNodePath(newPath);
	}

	@Override
	public Pair<Integer, NodePath> pop()
	{
		Integer head = path.head();
		List<Integer> tail = path.tail();
		
		return new Pair<Integer,NodePath>(head,new DefaultNodePath(tail));
	}

	@Override
	public Pair<Integer,NodePath> last(){
		Integer last = path.last();
		List<Integer> list = path.reverse().tail().reverse();
		return new Pair<Integer,NodePath>(last,new DefaultNodePath(list));
	}
	
	@Override
	public String toString()
	{
		return path.toString();
	}
	
	@Override
	public int size()
	{
		return path.length();
	}
	
	public List<DefaultNodePath> inits()
	{
		List<List<Integer>> inits = path.inits();
		inits = inits.filter(new F<List<Integer>,Boolean>(){
			@Override
			public Boolean f(List<Integer> init){
				return init.length() != 0;
			}
		});
		
		return inits.map(new F<List<Integer>,DefaultNodePath>(){
			@Override
			public DefaultNodePath f(List<Integer> path){
				return new DefaultNodePath(path);
			}
		});
	}

//PATHの一番後ろを取り除いたPATHを新しく作って返す
// EXAMPLE <0,0,3> → <0,0> 
	@Override
	public NodePath tail() {
		List<Integer> tail = path.reverse();
		tail = tail.tail().reverse();
		return new DefaultNodePath(tail);
	}

}