// Path: src/main/java/org/cyclops/integratedtunnels/core/part/PartStatePositionedAddon.java
// public class PartStatePositionedAddon<P extends IPartTypeWriter, N extends IPositionedAddonsNetwork, T> extends PartStateRoundRobin<P> {
// 
//     private final boolean canReceive;
//     private final boolean canExtract;
//     @Nullable
//     private N positionedAddonsNetwork;
//     @Nullable
//     private PositionedAddonsNetworkIngredientsFilter<T> storageFilter;
// 
//     public PartStatePositionedAddon(int inventorySize, boolean canReceive, boolean canExtract) {
//         super(inventorySize);
//         this.canReceive = canReceive;
//         this.canExtract = canExtract;
//     }
// 
//     @Nullable
//     public N getPositionedAddonsNetwork() {
//         return positionedAddonsNetwork;
//     }
// 
//     public void setPositionedAddonsNetwork(@Nullable N positionedAddonsNetwork) {
//         this.positionedAddonsNetwork = positionedAddonsNetwork;
//     }
// 
//     public boolean canReceive() {
//         return canReceive;
//     }
// 
//     public boolean canExtract() {
//         return canExtract;
//     }
// 
//     @Nullable
//     public PositionedAddonsNetworkIngredientsFilter<T> getStorageFilter() {
//         return storageFilter;
//     }
// 
//     public void setStorageFilter(@Nullable PositionedAddonsNetworkIngredientsFilter<T> storageFilter) {
//         this.storageFilter = storageFilter;
//     }
// }
// 
// Path: src/main/java/org/cyclops/integratedtunnels/core/part/PartStateRoundRobin.java
// public class PartStateRoundRobin<P extends IPartTypeWriter> extends PartStateWriterBase<P> {
// 
//     private IPartPosIteratorHandler partPosIteratorHandler = null;
// 
//     public PartStateRoundRobin(int inventorySize) {
//         super(inventorySize);
//     }
// 
//     public void setPartPosIteratorHandler(IPartPosIteratorHandler partPosIteratorHandler) {
//         this.partPosIteratorHandler = partPosIteratorHandler;
//     }
// 
//     public IPartPosIteratorHandler getPartPosIteratorHandler() {
//         return partPosIteratorHandler;
//     }
// }


import org.apache.logging.log4j.Level;
import org.cyclops.integrateddynamics.IntegratedDynamics;
import org.cyclops.integrateddynamics.api.PartStateException;
import org.cyclops.integrateddynamics.api.network.INetwork;
import org.cyclops.integrateddynamics.api.network.IPositionedAddonsNetwork;
import org.cyclops.integrateddynamics.api.part.PartPos;
import org.cyclops.integrateddynamics.core.helper.NetworkHelpers;
import org.cyclops.integrateddynamics.core.helper.PartHelpers;
import org.cyclops.integratedtunnels.core.part.PartStatePositionedAddon;
import org.cyclops.integratedtunnels.core.part.PartStateRoundRobin;
import javax.annotation.Nullable;
package org.cyclops.integratedtunnels.part.aspect;



/**
 * A helper class for movement targets with a certain network type.
 * @author rubensworks
 */
public interface IChanneledTarget<N extends IPositionedAddonsNetwork, T> {

    public INetwork getNetwork();

    public N getChanneledNetwork();

    public boolean hasValidTarget();

    public PartStateRoundRobin<?> getPartState();
// Path: src/main/java/org/cyclops/integratedtunnels/core/part/PartStatePositionedAddon.java
// public class PartStatePositionedAddon<P extends IPartTypeWriter, N extends IPositionedAddonsNetwork, T> extends PartStateRoundRobin<P> {
// 
//     private final boolean canReceive;
//     private final boolean canExtract;
//     @Nullable
//     private N positionedAddonsNetwork;
//     @Nullable
//     private PositionedAddonsNetworkIngredientsFilter<T> storageFilter;
// 
//     public PartStatePositionedAddon(int inventorySize, boolean canReceive, boolean canExtract) {
//         super(inventorySize);
//         this.canReceive = canReceive;
//         this.canExtract = canExtract;
//     }
// 
//     @Nullable
//     public N getPositionedAddonsNetwork() {
//         return positionedAddonsNetwork;
//     }
// 
//     public void setPositionedAddonsNetwork(@Nullable N positionedAddonsNetwork) {
//         this.positionedAddonsNetwork = positionedAddonsNetwork;
//     }
// 
//     public boolean canReceive() {
//         return canReceive;
//     }
// 
//     public boolean canExtract() {
//         return canExtract;
//     }
// 
//     @Nullable
//     public PositionedAddonsNetworkIngredientsFilter<T> getStorageFilter() {
//         return storageFilter;
//     }
// 
//     public void setStorageFilter(@Nullable PositionedAddonsNetworkIngredientsFilter<T> storageFilter) {
//         this.storageFilter = storageFilter;
//     }
// }
// 
// Path: src/main/java/org/cyclops/integratedtunnels/core/part/PartStateRoundRobin.java
// public class PartStateRoundRobin<P extends IPartTypeWriter> extends PartStateWriterBase<P> {
// 
//     private IPartPosIteratorHandler partPosIteratorHandler = null;
// 
//     public PartStateRoundRobin(int inventorySize) {
//         super(inventorySize);
//     }
// 
//     public void setPartPosIteratorHandler(IPartPosIteratorHandler partPosIteratorHandler) {
//         this.partPosIteratorHandler = partPosIteratorHandler;
//     }
// 
//     public IPartPosIteratorHandler getPartPosIteratorHandler() {
//         return partPosIteratorHandler;
//     }
// }


// Path: src/main/java/org/cyclops/integratedtunnels/part/aspect/IChanneledTarget.java
import org.apache.logging.log4j.Level;
import org.cyclops.integrateddynamics.IntegratedDynamics;
import org.cyclops.integrateddynamics.api.PartStateException;
import org.cyclops.integrateddynamics.api.network.INetwork;
import org.cyclops.integrateddynamics.api.network.IPositionedAddonsNetwork;
import org.cyclops.integrateddynamics.api.part.PartPos;
import org.cyclops.integrateddynamics.core.helper.NetworkHelpers;
import org.cyclops.integrateddynamics.core.helper.PartHelpers;
import org.cyclops.integratedtunnels.core.part.PartStatePositionedAddon;
import org.cyclops.integratedtunnels.core.part.PartStateRoundRobin;
import javax.annotation.Nullable;

package org.cyclops.integratedtunnels.part.aspect;



/**
 * A helper class for movement targets with a certain network type.
 * @author rubensworks
 */
public interface IChanneledTarget<N extends IPositionedAddonsNetwork, T> {

    public INetwork getNetwork();

    public N getChanneledNetwork();

    public boolean hasValidTarget();

    public PartStateRoundRobin<?> getPartState();
    public default PartStatePositionedAddon<?, ?, T> getPartStatePositionedAddon() {