( PolyKinds), , , , , , , , .
, GADT ( , , , , , @danidiaz).
. :
data Queue (kind :: a -> QueueType)
= Queue Name QueueType
Queue ( kind), Queue , QueueType . Queue Name QueueType kind; phantom. QueueType , kind Queue kind .
, GHC , publish, Queue 'Direct; , .
GADT , , . , ( ), .
, Queue 'Direct , Queue 'Topic , Queue a.
QueueType GADT, . , , ( PolyKinds), ( !) , . :
data QueueType
= Direct
| Topic
data QueueData (a :: QueueType)
where DirectData :: DirectKey -> QueueData 'Direct
TopicData :: TopicKey -> QueueData 'Topic
, QueueType DataKinds ( - ). QueueData, QueueType. DirectKey a QueueData 'Direct, a TopicKey a QueueData 'Topic.
Queue,
:
data Queue (a :: QueueType)
= Queue Name (QueueData a)
, (, QueueData), Queue a:
getName :: Queue a -> Text
getName (Queue name _) = name
Queue a, , , :
getKeyText :: Queue a -> Text
getKeyText (Queue _ (DirectData key)) = key
getKeyText (Queue _ (TopicData keys)) = mconcat keys
, , Queue 'Direct, publish, GHC , DirectData QueueData. , , OP, , TopicData .
:
{-
import Data.Text (Text)
type Name = Text
type DirectKey = Text
type TopicKey = [Text]
data QueueType
= Direct
| Topic
data QueueData (a :: QueueType)
where DirectData :: DirectKey -> QueueData 'Direct
TopicData :: TopicKey -> QueueData 'Topic
data Queue (a :: QueueType)
= Queue Name (QueueData a)
getName :: Queue a -> Text
getName (Queue name _) = name
getKeyText :: Queue a -> Text
getKeyText (Queue _ (DirectData key)) = key
getKeyText (Queue _ (TopicData keys)) = mconcat keys
publish :: Queue 'Direct -> IO ()
publish (Queue name (DirectData key))
= doSomething name key
where doSomething = undefined