{-# LANGUAGE MultiParamTypeClasses #-}

module Scavenge.ClueState where

import Test.QuickCheck
import QuickSpec
import Data.Semigroup

data ClueState
  = Seen | Failed | Completed  -- ! 1
  deriving stock (Eq, Ord, Show, Enum, Bounded)
  deriving (Semigroup, Monoid) via Max ClueState  -- ! 2

instance Observe () ClueState ClueState

instance Arbitrary ClueState where
  arbitrary = elements $ enumFromTo minBound maxBound

seen :: ClueState
seen = Seen

completed :: ClueState
completed = Completed

failed :: ClueState
failed = Failed

------------------------------------------------------------------------------

sig_cluestate :: Sig
sig_cluestate = signature
  [ con "seen"      $ seen
  , con "completed" $ completed
  , con "failed"    $ failed
  , con "<>"        $ (<>) @ClueState
  , mono @ClueState
  ]