package org.finra.datagenerator.scaffolding.transformer.function.impl;
import org.finra.datagenerator.scaffolding.transformer.function.Direction;
import org.finra.datagenerator.scaffolding.transformer.function.NumericSequential;
import org.finra.datagenerator.scaffolding.transformer.service.TransformationContext;
import org.springframework.util.Assert;
import java.util.concurrent.atomic.AtomicLong;
/**
* Created by dkopel on 11/18/16.
*/
public class LongSequential extends NumericSequential<Long> {
private final Long start;
private final Long step;
private final AtomicLong current;
private final Direction direction;
public LongSequential(Long start, Long step, Direction direction) {
Assert.notNull(start, "A starting value is required.");
Assert.notNull(step, "An incremental step value is required.");
Assert.notNull(direction, "An iteration direction is required.");
this.start = start;
this.step = step;
this.direction = direction;
this.current = new AtomicLong(start);
}
public LongSequential(Long start, Long step) {
this(start, step, Direction.ASCENDING);
}
public LongSequential() {
this.start = 0L;
this.step = 1L;
this.current = new AtomicLong(start);
this.direction = Direction.ASCENDING;
}
@Override
public Long getStart() {
return start;
}
@Override
public Long getStep() {
return step;
}
@Override
public Direction getDirection() {
return direction;
}
@Override
public Long next(TransformationContext context) {
if(direction.equals(Direction.ASCENDING)) {
return current.getAndAdd(step);
} else {
return current.getAndAdd(step * -1);
}
}
}