packages feed

swarm-0.7.0.0: src/swarm-topography/Swarm/Game/Scenario/Topography/Structure/Recognition/Log.hs

-- |
-- SPDX-License-Identifier: BSD-3-Clause
--
-- Types strictly for debugging structure recognition via the web interface
module Swarm.Game.Scenario.Topography.Structure.Recognition.Log where

import Data.Aeson
import Data.List.NonEmpty (NonEmpty)
import Data.List.NonEmpty.Extra qualified as NE
import GHC.Generics (Generic)
import Servant.Docs (ToSample)
import Servant.Docs qualified as SD
import Swarm.Game.Location (Location)
import Swarm.Game.Scenario.Topography.Structure.Named (StructureName, name)
import Swarm.Game.Scenario.Topography.Structure.Recognition.Static (
  OrientedStructure,
 )
import Swarm.Game.Scenario.Topography.Structure.Recognition.Type
import Swarm.Game.Universe (Cosmic)
import Swarm.Language.Syntax.Direction (AbsoluteDir)

renderSharedNames :: ConsolidatedRowReferences b a -> NonEmpty StructureName
renderSharedNames =
  NE.nubOrd . NE.map (name . originalItem . entityGrid . wholeStructure) . referencingRows

data ParticipatingEntity e = ParticipatingEntity
  { entity :: e
  , searchOffsets :: InspectionOffsets
  }
  deriving (Functor, Generic, ToJSON)

data IntactPlacementLog e = IntactPlacementLog
  { intactnessFailure :: Maybe (StructureIntactnessFailure e)
  , placedStructure :: PositionedStructure OrientedStructure
  }
  deriving (Functor, Generic, ToJSON)

data ChunkMatchFailureReason e
  = ChunkMatchFailureReason (NonEmpty StructureName) (RowMismatchReason e)
  deriving (Functor, Generic, ToJSON)

data FoundChunkComparison e = FoundChunkComparison
  { foundChunkKeys :: [NonEmpty e]
  , referenceChunkKeys :: [NonEmpty e]
  }
  deriving (Functor, Generic, ToJSON)

data RowMismatchReason e
  = NoKeysSubset (FoundChunkComparison e)
  | -- | NOTE: we should never see 'EmptyIntersection',
    -- since the earlier 'NoKeysSubset' condition
    -- results in an empty intersection
    EmptyIntersection
  deriving (Functor, Generic, ToJSON)

data SearchLog e
  = IntactStaticPlacement [IntactPlacementLog e]
  | StartSearchAt (Cosmic Location) InspectionOffsets
  | FoundParticipatingEntity (ParticipatingEntity e)
  | FoundCompleteStructureCandidates [(OrientedStructure, Cosmic Location)]
  | RecognizedSingleStructure (OrientedStructure, Cosmic Location)
  | -- | this is actually internally used as a (Map (NonEmpty e) (NonEmpty Int)),
    -- but the requirements of Functor force us to invert the mapping
    FoundPiecewiseChunks [(NonEmpty Int, NonEmpty e)]
  | ExpectedChunks (NonEmpty [NonEmpty e])
  | WorldRowContent [Maybe e]
  | ChunksMatchingExpected [ChunkedRowMatch (NonEmpty StructureName) e]
  | ChunkFailures [ChunkMatchFailureReason e]
  | ChunkIntactnessVerification (IntactPlacementLog e)
  | StructureRemoved StructureName
  deriving (Functor, Generic)

instance (ToJSON e) => ToJSON (SearchLog e) where
  toJSON = genericToJSON searchLogOptions

searchLogOptions :: Options
searchLogOptions =
  defaultOptions
    { sumEncoding = ObjectWithSingleField
    }

instance ToSample (SearchLog e) where
  toSamples _ = SD.noSamples

data StructureLocation = StructureLocation StructureName (Cosmic Location, AbsoluteDir)
  deriving (Generic, ToJSON)

instance ToSample StructureLocation where
  toSamples _ = SD.noSamples