diff --git a/src/main/scala/com/sageserpent/americium/TrialsApiImplementation.scala b/src/main/scala/com/sageserpent/americium/TrialsApiImplementation.scala index 16502139..12d7ee78 100644 --- a/src/main/scala/com/sageserpent/americium/TrialsApiImplementation.scala +++ b/src/main/scala/com/sageserpent/americium/TrialsApiImplementation.scala @@ -90,9 +90,7 @@ class TrialsApiImplementation extends CommonApi with ScalaTrialsApi { new TrialsImplementation(NoteComplexity) override def uniqueIds: TrialsImplementation[Int] = { - // NASTY HACK: add an additional level of gratuitous complexity after - // retrieving the context's complexity. That forces uniqueness. - complexities.flatMap(id => choose(Iterable.single(())).map(_ => id)) + new TrialsImplementation(UniqueId) } def resetComplexity(complexity: Int): TrialsImplementation[Unit] = diff --git a/src/main/scala/com/sageserpent/americium/generation/GenerationOperation.scala b/src/main/scala/com/sageserpent/americium/generation/GenerationOperation.scala index 860102e2..6fa398ba 100644 --- a/src/main/scala/com/sageserpent/americium/generation/GenerationOperation.scala +++ b/src/main/scala/com/sageserpent/americium/generation/GenerationOperation.scala @@ -28,3 +28,5 @@ case object NoteComplexity extends GenerationOperation[Int] case class ResetComplexity[Case](complexity: Int) extends GenerationOperation[Unit] + +case object UniqueId extends GenerationOperation[Int] diff --git a/src/main/scala/com/sageserpent/americium/generation/SupplyToSyntaxSkeletalImplementation.scala b/src/main/scala/com/sageserpent/americium/generation/SupplyToSyntaxSkeletalImplementation.scala index d3e407d4..7321e5d0 100644 --- a/src/main/scala/com/sageserpent/americium/generation/SupplyToSyntaxSkeletalImplementation.scala +++ b/src/main/scala/com/sageserpent/americium/generation/SupplyToSyntaxSkeletalImplementation.scala @@ -234,19 +234,23 @@ trait SupplyToSyntaxSkeletalImplementation[Case] decisionStagesToGuideShrinkage: Option[DecisionStages], decisionStagesInReverseOrder: DecisionStagesInReverseOrder, complexity: Int, - cost: BigInt + cost: BigInt, + nextUniqueId: Int ) { def update( remainingGuidance: Option[DecisionStages], decision: Decision, costIncrement: BigInt = BigInt(0) - ): State = State( + ): State = copy( decisionStagesToGuideShrinkage = remainingGuidance, decisionStagesInReverseOrder = decisionStagesInReverseOrder.addLatest(decision), complexity = 1 + complexity, cost = cost + costIncrement ) + + def uniqueId(): (State, Int) = + copy(nextUniqueId = 1 + nextUniqueId) -> nextUniqueId } object State { @@ -254,7 +258,8 @@ trait SupplyToSyntaxSkeletalImplementation[Case] decisionStagesToGuideShrinkage = decisionStagesToGuideShrinkage, decisionStagesInReverseOrder = NoDecisionStages, complexity = 0, - cost = BigInt(0) + cost = BigInt(0), + nextUniqueId = 0 ) } @@ -521,6 +526,9 @@ trait SupplyToSyntaxSkeletalImplementation[Case] case ResetComplexity(_) => StateT.pure(()) + + case UniqueId => + StateT[Option, State, Int](state => Some(state.uniqueId())) } } @@ -574,7 +582,7 @@ trait SupplyToSyntaxSkeletalImplementation[Case] .run(State.initial) match { case Some( ( - State(_, decisionStages, _, factoryInputsCost), + State(_, decisionStages, _, factoryInputsCost, _), caze ) )