{-# LANGUAGE DeriveAnyClass #-}

module Hercules.API.Task where

import qualified Hercules.API.Id as Id
import Hercules.API.Prelude hiding (id)

-- | A task, typically performed by the agent.
--
-- The phantom represents the type of task. See 'AnyTask'.
data Task a = Task
  { forall a. Task a -> Text
typ :: Text,
    forall a. Task a -> Id (Task a)
id :: Id (Task a)
  }
  deriving (forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (Task a) x -> Task a
forall a x. Task a -> Rep (Task a) x
$cto :: forall a x. Rep (Task a) x -> Task a
$cfrom :: forall a x. Task a -> Rep (Task a) x
Generic, Int -> Task a -> ShowS
forall a. Int -> Task a -> ShowS
forall a. [Task a] -> ShowS
forall a. Task a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Task a] -> ShowS
$cshowList :: forall a. [Task a] -> ShowS
show :: Task a -> String
$cshow :: forall a. Task a -> String
showsPrec :: Int -> Task a -> ShowS
$cshowsPrec :: forall a. Int -> Task a -> ShowS
Show, Task a -> Task a -> Bool
forall a. Task a -> Task a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Task a -> Task a -> Bool
$c/= :: forall a. Task a -> Task a -> Bool
== :: Task a -> Task a -> Bool
$c== :: forall a. Task a -> Task a -> Bool
Eq, forall a. Task a -> ()
forall a. (a -> ()) -> NFData a
rnf :: Task a -> ()
$crnf :: forall a. Task a -> ()
NFData, forall a. [Task a] -> Encoding
forall a. [Task a] -> Value
forall a. Task a -> Encoding
forall a. Task a -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [Task a] -> Encoding
$ctoEncodingList :: forall a. [Task a] -> Encoding
toJSONList :: [Task a] -> Value
$ctoJSONList :: forall a. [Task a] -> Value
toEncoding :: Task a -> Encoding
$ctoEncoding :: forall a. Task a -> Encoding
toJSON :: Task a -> Value
$ctoJSON :: forall a. Task a -> Value
ToJSON, forall a. Value -> Parser [Task a]
forall a. Value -> Parser (Task a)
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [Task a]
$cparseJSONList :: forall a. Value -> Parser [Task a]
parseJSON :: Value -> Parser (Task a)
$cparseJSON :: forall a. Value -> Parser (Task a)
FromJSON)

-- | @'Task' 'Any' represents tasks whose type has not yet been
-- read.
data Any

-- | Safe type cast.
upcast :: Task a -> Task Any
upcast :: forall a. Task a -> Task Any
upcast = forall a b. Task a -> Task b
uncheckedCast

-- | Safe type cast.
upcastId :: Id (Task a) -> Id (Task Any)
upcastId :: forall a. Id (Task a) -> Id (Task Any)
upcastId = forall {k1} {k2} (a :: k1) (b :: k2). Id a -> Id b
Id.uncheckedCast

uncheckedCast :: Task a -> Task b
uncheckedCast :: forall a b. Task a -> Task b
uncheckedCast Task a
a = Task a
a {id :: Id (Task b)
id = forall {k1} {k2} (a :: k1) (b :: k2). Id a -> Id b
Id.uncheckedCast (forall a. Task a -> Id (Task a)
id Task a
a)}