@@ -15,6 +15,7 @@ import Control.Monad
15
15
-- This import is only needed when 'getDoc' is available.
16
16
import Data.Maybe (maybeToList )
17
17
#endif
18
+ import Data.Maybe (mapMaybe )
18
19
import Data.Proxy
19
20
import Language.Haskell.TH
20
21
import Language.Haskell.TH.Datatype
@@ -34,45 +35,29 @@ describeProtocol protoTyCon protoTyArgs codecTyCon codecTyArgs = do
34
35
protoDescription <- getDescription protoTyCon
35
36
let pname = nameBase (datatypeName info)
36
37
37
- let extractMessageStateNames :: InstanceDec -> [Name ]
38
- extractMessageStateNames (DataInstD _ _ _ _ tys _) =
39
- [ case ty of
40
- ForallC _ _ (GadtC _ _ ty') -> go ty'
41
- GadtC _ _ ty' -> go ty'
42
- _ -> error $ " Not a GADT: " ++ show ty
43
- | ty <- tys
44
- ]
45
- where
46
- go (PromotedT tyName) = tyName
47
- go (SigT ty' _) = go ty'
48
- go (AppT _ ty') = go ty'
49
- go ty' = error $ " Cannot detect message name from type: " ++ show ty'
50
- extractMessageStateNames i = error $ " Not a DataInstD: " ++ show i
38
+ let extractAgency :: InstanceDec -> Maybe Name
39
+ extractAgency (TySynInstD (TySynEqn _ _ (PromotedT agency))) = Just agency
40
+ extractAgency dec = error $ " Unexpected InstanceDec: " ++ show dec
41
+
42
+ let extractAgencies :: [InstanceDec ] -> [Name ]
43
+ extractAgencies = mapMaybe extractAgency
44
+
45
+ let extractTheAgency :: [InstanceDec ] -> Name
46
+ extractTheAgency inst = case extractAgencies inst of
47
+ [agency] -> agency
48
+ xs -> error $ " Incorrect number of agencies: " ++ show xs
51
49
52
50
pstates <- forM (datatypeCons info) $ \ conInfo -> do
53
51
let conName = constructorName conInfo
54
52
stateDescription <- getDescription conName
55
53
56
- serverAgencies <- reifyInstances ''ServerHasAgency [ConT conName]
57
- let serverAgencies' =
58
- [ nameBase tyName
59
- | inst <- serverAgencies
60
- , tyName <- extractMessageStateNames inst
61
- , nameBase tyName == nameBase conName
62
- ]
63
- clientAgencies <- reifyInstances ''ClientHasAgency [ConT conName]
64
- let clientAgencies' =
65
- [ nameBase tyName
66
- | inst <- clientAgencies
67
- , tyName <- extractMessageStateNames inst
68
- , nameBase tyName == nameBase conName
69
- ]
70
-
71
- let agencyID = case (serverAgencies', clientAgencies') of
72
- ([] , [] ) -> NobodyAgencyID
73
- (_, [] ) -> ServerAgencyID
74
- ([] , _) -> ClientAgencyID
75
- _ -> error $ show (nameBase conName, serverAgencies', clientAgencies')
54
+ stateAgencies <- reifyInstances ''StateAgency [ConT conName]
55
+ let agencyName = extractTheAgency stateAgencies
56
+ agencyID = case nameBase agencyName of
57
+ " ServerAgency" -> 'ServerAgencyID
58
+ " ClientAgency" -> 'ClientAgencyID
59
+ " NobodyAgency" -> 'NobodyAgencyID
60
+ x -> error $ " Unknown agency type " ++ x ++ " in state " ++ nameBase conName
76
61
77
62
return (conName, stateDescription, agencyID)
78
63
@@ -87,7 +72,7 @@ describeProtocol protoTyCon protoTyArgs codecTyCon codecTyArgs = do
87
72
protoDescription
88
73
" "
89
74
$ (listE
90
- [ [| ( $ (makeState $ ConT conName), stateDescription, agencyID) | ]
75
+ [ [| ( $ (makeState $ ConT conName), stateDescription, $ (conE agencyID) ) | ]
91
76
| (conName, stateDescription, agencyID) <- pstates
92
77
]
93
78
)
0 commit comments