@@ -1,6 +1,5 @@
1{-# LANGUAGE LambdaCase #-}
1{-# LANGUAGE LambdaCase #-}
2{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
3−{-# LANGUAGE TupleSections #-}
4{-# LANGUAGE ViewPatterns #-}
3{-# LANGUAGE ViewPatterns #-}
6-- Module : Gen.Syntax
5-- Module : Gen.Syntax
@@ -26,39 +25,38 @@ import Gen.Text
26import Gen.Types
25import Gen.Types
27import Language.Haskell.Exts.Build (app, appFun, infixApp, lamE, listE, name, noBinds, paren, patBind, pvar, sfun, strE, sym,
26import Language.Haskell.Exts.Build (app, appFun, infixApp, lamE, listE, name, noBinds, paren, patBind, pvar, sfun, strE, sym,
29−import Language.Haskell.Exts.SrcLoc
30import Language.Haskell.Exts.Syntax hiding (Alt, Int, Lit)
28import Language.Haskell.Exts.Syntax hiding (Alt, Int, Lit)
32−serviceSig :: Name -> Decl
30+serviceSig :: Name () -> Decl ()
33−serviceSig n = TypeSig noLoc [n] (TyCon "ServiceConfig")
31+serviceSig n = TypeSig () [n] (TyCon () "ServiceConfig")
35−serviceDecl :: Service a -> Name -> Decl
33+serviceDecl :: Service a -> Name () -> Decl ()
36−serviceDecl s n = sfun noLoc n [] (UnGuardedRhs rhs) noBinds
34+serviceDecl s n = sfun n [] (UnGuardedRhs () rhs) noBinds
38 rhs = appFun (var "defaultService")
36 rhs = appFun (var "defaultService")
39 [ app (var "ServiceId") (str (s ^. dId))
37 [ app (var "ServiceId") (str (s ^. dId))
40 , str . stripSuffix "/" $ stripPrefix "https://" (s ^. dRootUrl)
38 , str . stripSuffix "/" $ stripPrefix "https://" (s ^. dRootUrl)
43−scopeSig :: Name -> Text -> Decl
41+scopeSig :: Name () -> Text -> Decl ()
44−scopeSig n v = TypeSig noLoc [n] $
42+scopeSig n v = TypeSig () [n] $
45− TyApp (TyCon "Proxy") $
43+ TyApp () (TyCon () "Proxy") $
46− TyPromoted $ PromotedList True
44+ TyPromoted () $ PromotedList () True
47− [ TyPromoted $ PromotedString (Text.unpack v)
45+ [ TyPromoted () $ PromotedString () (Text.unpack v) (Text.unpack v)
50−scopeDecl :: Name -> Decl
48+scopeDecl :: Name () -> Decl ()
51−scopeDecl n = sfun noLoc n [] (UnGuardedRhs (var "Proxy")) noBinds
49+scopeDecl n = sfun n [] (UnGuardedRhs () (var "Proxy")) noBinds
53−apiAlias :: Name -> [Name] -> Decl
51+apiAlias :: Name () -> [Name ()] -> Decl ()
54−apiAlias n ls = TypeDecl noLoc n [] alias
52+apiAlias n ls = TypeDecl () (DHead () n) alias
56− alias = case map (TyCon . UnQual) ls of
54+ alias = case map (TyCon () . UnQual ()) ls of
57− [] -> unit_tycon
55+ [] -> unit_tycon ()
58− x:xs -> foldl' (\l r -> TyInfix l (UnQual (sym ":<|>")) r) x xs
56+ x:xs -> foldl' (\l r -> TyInfix () l ((UnpromotedName () . UnQual ()) (sym ":<|>")) r) x xs
60−verbAlias :: HasDescription a s => a -> Name -> Method Solved -> Decl
58+verbAlias :: HasDescription a s => a -> Name () -> Method Solved -> Decl ()
61−verbAlias d n m = TypeDecl noLoc n [] $ servantOr meta (catMaybes [down, up])
59+verbAlias d n m = TypeDecl () (DHead () n) $ servantOr meta (catMaybes [down, up])
63 meta = path $ metadataAlias m
61 meta = path $ metadataAlias m
64 down = path <$> downloadAlias m
62 down = path <$> downloadAlias m
@@ -68,18 +66,18 @@ verbAlias d n m = TypeDecl noLoc n [] $ servantOr meta (catMaybes [down, up])
69 root = subPaths (d ^. dServicePath) ++ requestPath m (_mPath m)
67 root = subPaths (d ^. dServicePath) ++ requestPath m (_mPath m)
71−metadataAlias :: Method Solved -> Type
69+metadataAlias :: Method Solved -> Type ()
72metadataAlias m = servantSub (jsonVerb m) (params ++ media)
70metadataAlias m = servantSub (jsonVerb m) (params ++ media)
74 params = requestQuery m (requestQueryParams m)
72 params = requestQuery m (requestQueryParams m)
75 media = case _mRequest m of
73 media = case _mRequest m of
76 Nothing -> []
74 Nothing -> []
78− [ TyApp (TyApp (TyCon "ReqBody") jsonMedia)
76+ [ TyApp () (TyApp () (TyCon () "ReqBody") jsonMedia)
79 (tycon (ref b))
77 (tycon (ref b))
82−downloadAlias :: Method Solved -> Maybe Type
80+downloadAlias :: Method Solved -> Maybe (Type ())
83downloadAlias m
81downloadAlias m
84 | _mSupportsMediaDownload m = Just download
82 | _mSupportsMediaDownload m = Just download
85 | otherwise = Nothing
83 | otherwise = Nothing
@@ -88,7 +86,7 @@ downloadAlias m
89 params = requestQuery m . Map.delete "alt" $ requestQueryParams m
87 params = requestQuery m . Map.delete "alt" $ requestQueryParams m
91−uploadAlias :: [Type] -> Method Solved -> Maybe Type
89+uploadAlias :: [Type ()] -> Method Solved -> Maybe (Type ())
92uploadAlias sub m
90uploadAlias sub m
93 | _mSupportsMediaUpload m = Just upload
91 | _mSupportsMediaUpload m = Just upload
94 | otherwise = Nothing
92 | otherwise = Nothing
@@ -104,16 +102,16 @@ uploadAlias sub m
104 media = case _mRequest m of
102 media = case _mRequest m of
105 Just b ->
103 Just b ->
106 [ multipartParam
104 [ multipartParam
107− , TyApp (TyApp (TyCon "MultipartRelated") jsonMedia)
105+ , TyApp () (TyApp () (TyCon () "MultipartRelated") jsonMedia)
108 (tycon (ref b))
106 (tycon (ref b))
111 Nothing ->
109 Nothing ->
112 [ mediaParam
110 [ mediaParam
113− , TyCon "AltMedia"
111+ , TyCon () "AltMedia"
116−requestPath :: Method Solved -> Text -> [Type]
114+requestPath :: Method Solved -> Text -> [Type ()]
117requestPath m = map go . extractPath
115requestPath m = map go . extractPath
119 go (Left t) = sing t
117 go (Left t) = sing t
@@ -121,29 +119,29 @@ requestPath m = map go . extractPath
121 Nothing -> error $ "Unable to find path parameter " ++ show l
119 Nothing -> error $ "Unable to find path parameter " ++ show l
122 Just x -> case c of
120 Just x -> case c of
123 Nothing | x ^. iRepeated ->
121 Nothing | x ^. iRepeated ->
124− TyApp (TyApp (TyCon "Captures")
122+ TyApp () (TyApp () (TyCon () "Captures")
125 (sing (local l)))
123 (sing (local l)))
126 (terminalType (_type (_pParam x)))
124 (terminalType (_type (_pParam x)))
128 Nothing ->
126 Nothing ->
129− TyApp (TyApp (TyCon "Capture")
127+ TyApp () (TyApp () (TyCon () "Capture")
130 (sing (local l)))
128 (sing (local l)))
131 (terminalType (_type (_pParam x)))
129 (terminalType (_type (_pParam x)))
133 Just y ->
131 Just y ->
134− TyApp (TyApp (TyApp (TyCon "CaptureMode")
132+ TyApp () (TyApp () (TyApp () (TyCon () "CaptureMode")
135 (sing (local l)))
133 (sing (local l)))
136 (sing y))
134 (sing y))
137 (terminalType (_type (_pParam x)))
135 (terminalType (_type (_pParam x)))
139−requestQuery :: Method Solved -> Map Local (Param Solved) -> [Type]
137+requestQuery :: Method Solved -> Map Local (Param Solved) -> [Type ()]
140requestQuery m xs = mapMaybe go $
138requestQuery m xs = mapMaybe go $
141 orderParams fst (Map.toList xs) (_mParameterOrder m)
139 orderParams fst (Map.toList xs) (_mParameterOrder m)
143 go (k, x) = case _pLocation x of
141 go (k, x) = case _pLocation x of
144 Query | x ^. iRepeated
142 Query | x ^. iRepeated
145− -> Just $ TyApp (TyApp (TyCon "QueryParams") n) t
143+ -> Just $ TyApp () (TyApp () (TyCon () "QueryParams") n) t
146− Query -> Just $ TyApp (TyApp (TyCon "QueryParam") n) t
144+ Query -> Just $ TyApp () (TyApp () (TyCon () "QueryParam") n) t
147 Path -> Nothing
145 Path -> Nothing
149 t = terminalType (_type (_pParam x))
147 t = terminalType (_type (_pParam x))
@@ -152,52 +150,47 @@ requestQuery m xs = mapMaybe go $
152requestQueryParams :: Method a -> Map Local (Param a)
150requestQueryParams :: Method a -> Map Local (Param a)
153requestQueryParams = Map.filter ((/= Path) . _pLocation) . _mParameters
151requestQueryParams = Map.filter ((/= Path) . _pLocation) . _mParameters
155−servantOr, servantSub :: Type -> [Type] -> Type
153+servantOr, servantSub :: Type () -> [Type ()] -> Type ()
156−servantOr = foldl' (\l r -> TyInfix l (UnQual (sym ":<|>")) r)
154+servantOr = foldl' (\l r -> TyInfix () l ((UnpromotedName () . UnQual ()) (sym ":<|>")) r)
157−servantSub = foldr' (\l r -> TyInfix l (UnQual (sym ":>")) r)
155+servantSub = foldr' (\l r -> TyInfix () l ((UnpromotedName () . UnQual ()) (sym ":>")) r)
159−jsonVerb :: Method a -> Type
157+jsonVerb :: Method a -> Type ()
160jsonVerb m =
158jsonVerb m =
161− TyApp (TyApp (httpMethod m) jsonMedia)
159+ TyApp () (TyApp () (httpMethod m) jsonMedia)
162− $ maybe (TyCon "()") (tycon . ref) (_mResponse m)
160+ $ maybe (TyCon () "()") (tycon . ref) (_mResponse m)
164−downloadVerb :: Method a -> Type
162+downloadVerb :: Method a -> Type ()
165downloadVerb m =
163downloadVerb m =
166− TyApp (TyApp (httpMethod m) streamMedia)
164+ TyApp () (TyApp () (httpMethod m) streamMedia)
167− (TyCon "Stream")
165+ (TyCon () "Stream")
169−httpMethod :: Method a -> Type
167+httpMethod :: Method a -> Type ()
170−httpMethod = TyCon . unqual . Text.unpack . Text.toTitle . _mHttpMethod
168+httpMethod = TyCon () . unqual . Text.unpack . Text.toTitle . _mHttpMethod
172−subPaths :: Text -> [Type]
170+subPaths :: Text -> [Type ()]
173subPaths = map sing . filter (not . Text.null) . Text.split (== '/')
171subPaths = map sing . filter (not . Text.null) . Text.split (== '/')
175−jsonMedia, streamMedia :: Type
173+jsonMedia, streamMedia :: Type ()
176jsonMedia = tylist ["JSON"]
174jsonMedia = tylist ["JSON"]
177streamMedia = tylist ["OctetStream"]
175streamMedia = tylist ["OctetStream"]
179−downloadParam :: Type
177+downloadParam :: Type ()
180downloadParam =
178downloadParam =
181− TyApp (TyApp (TyCon "QueryParam") (sing "alt"))
179+ TyApp () (TyApp () (TyCon () "QueryParam") (sing "alt"))
182− (TyCon "AltMedia")
180+ (TyCon () "AltMedia")
184−mediaParam :: Type
182+mediaParam :: Type ()
185mediaParam =
183mediaParam =
186− TyApp (TyApp (TyCon "QueryParam") (sing "uploadType"))
184+ TyApp () (TyApp () (TyCon () "QueryParam") (sing "uploadType"))
187− (TyCon "AltMedia")
185+ (TyCon () "AltMedia")
189−multipartParam :: Type
187+multipartParam :: Type ()
190multipartParam =
188multipartParam =
191− TyApp (TyApp (TyCon "QueryParam") (sing "uploadType"))
189+ TyApp () (TyApp () (TyCon () "QueryParam") (sing "uploadType"))
192− (TyCon "Multipart")
190+ (TyCon () "Multipart")
194−metadataPat, downloadPat, uploadPat :: Method a -> Pat
195−metadataPat = pattern 1
196−downloadPat = pattern 2
197−uploadPat = pattern 3
199−pattern :: Integer -> Method a -> Pat
192+pattern' :: Integer -> Method a -> Pat ()
200−pattern n m = case (n, down, up) of
193+pattern' n m = case (n, down, up) of
201 (1, True, True) -> infixOr go (infixOr wild wild)
194 (1, True, True) -> infixOr go (infixOr wild wild)
202 (2, True, True) -> infixOr wild (infixOr go wild)
195 (2, True, True) -> infixOr wild (infixOr go wild)
203 (_, True, True) -> infixOr wild (infixOr wild go)
196 (_, True, True) -> infixOr wild (infixOr wild go)
@@ -214,51 +207,57 @@ pattern n m = case (n, down, up) of
214 up = _mSupportsMediaUpload m
207 up = _mSupportsMediaUpload m
216 go = pvar "go"
209 go = pvar "go"
217− wild = PWildCard
210+ wild = PWildCard ()
212+ infixOr l = PInfixApp () l (UnQual () (sym ":<|>"))
214+metadataPat, downloadPat, uploadPat :: Method a -> Pat ()
215+metadataPat = pattern' 1
216+downloadPat = pattern' 2
217+uploadPat = pattern' 3
219− infixOr l r = PInfixApp l (UnQual (sym ":<|>")) r
221downloadDecl :: Global
220downloadDecl :: Global
222 -> Prefix
221 -> Prefix
223− -> Name
222+ -> Name ()
224− -> Name
223+ -> Name ()
225 -> [Local]
224 -> [Local]
226 -> Method Solved
225 -> Method Solved
227− -> Decl
226+ -> Decl ()
228downloadDecl n pre api url fs m =
227downloadDecl n pre api url fs m =
229− googleRequestDecl ty [rs, ss] [alt] pre api url m pat prec
228+ googleRequestDecl (TyParen () ty) [rs, ss] [alt] pre api url m pat prec
231− ty = TyApp (TyCon "MediaDownload") (tycon n)
230+ ty = TyApp () (TyCon () "MediaDownload") (tycon n)
233− rs = InsType noLoc (TyApp (TyCon "Rs") ty) (TyCon "Stream")
232+ rs = InsType () (TyApp () (TyCon () "Rs") ty) (TyCon () "Stream")
235− ss = InsType noLoc (TyApp (TyCon "Scopes") ty) $
234+ ss = InsType () (TyApp () (TyCon () "Scopes") ty) $
236− TyApp (TyCon "Scopes") (tycon n)
235+ TyApp () (TyCon () "Scopes") (tycon n)
238 alt = app (var "Just") (var "AltMedia")
237 alt = app (var "Just") (var "AltMedia")
239 pat = downloadPat m
238 pat = downloadPat m
241− prec = PApp (UnQual "MediaDownload")
240+ prec = PApp () (UnQual () "MediaDownload")
242− [ PRec (UnQual (dname' n)) [PFieldWildcard | not (null fs)]
241+ [ PRec () (UnQual () (dname' n)) [PFieldWildcard () | not (null fs)]
245uploadDecl :: Global
244uploadDecl :: Global
246 -> Prefix
245 -> Prefix
247− -> Name
246+ -> Name ()
248− -> Name
247+ -> Name ()
249 -> [Local]
248 -> [Local]
250 -> Method Solved
249 -> Method Solved
251− -> Decl
250+ -> Decl ()
252uploadDecl n pre api url fs m =
251uploadDecl n pre api url fs m =
253− googleRequestDecl ty [rs, ss] extras pre api url m pat prec
252+ googleRequestDecl (TyParen () ty) [rs, ss] extras pre api url m pat prec
255− ty = TyApp (TyCon "MediaUpload") (tycon n)
254+ ty = TyApp () (TyCon () "MediaUpload") (tycon n)
257− rs = InsType noLoc (TyApp (TyCon "Rs") ty) $
256+ rs = InsType () (TyApp () (TyCon () "Rs") ty) $
258− maybe unit_tycon (tycon . ref) (_mResponse m)
257+ maybe (unit_tycon ()) (tycon . ref) (_mResponse m)
260− ss = InsType noLoc (TyApp (TyCon "Scopes") ty) $
259+ ss = InsType () (TyApp () (TyCon () "Scopes") ty) $
261− TyApp (TyCon "Scopes") (tycon n)
260+ TyApp () (TyCon () "Scopes") (tycon n)
263 extras = maybeToList alt ++ [upl] ++ payload ++ [var media]
262 extras = maybeToList alt ++ [upl] ++ payload ++ [var media]
@@ -276,30 +275,32 @@ uploadDecl n pre api url fs m =
277 pat = uploadPat m
276 pat = uploadPat m
279− prec = PApp (UnQual "MediaUpload")
278+ prec = PApp () (UnQual () "MediaUpload")
280− [ PRec (UnQual (dname' n)) [PFieldWildcard | not (null fs)]
279+ [ PRec () (UnQual () (dname' n)) [PFieldWildcard () | not (null fs)]
281− , PVar media
280+ , PVar () media
284 media = name "body"
283 media = name "body"
286requestDecl :: Global
285requestDecl :: Global
287 -> Prefix
286 -> Prefix
288− -> Name
287+ -> Name ()
289− -> Name
288+ -> Name ()
290 -> [Local]
289 -> [Local]
291 -> Method Solved
290 -> Method Solved
292− -> Decl
291+ -> Decl ()
293requestDecl n pre api url fs m =
292requestDecl n pre api url fs m =
294 googleRequestDecl (tycon n) [rs, ss] extras pre api url m pat prec
293 googleRequestDecl (tycon n) [rs, ss] extras pre api url m pat prec
296− rs = InsType noLoc (TyApp (TyCon "Rs") (tycon n)) $
296+ rs = InsType () (TyApp () (TyCon () "Rs") (tycon n)) $
297− maybe unit_tycon (tycon . ref) (_mResponse m)
297+ maybe (unit_tycon ()) (tycon . ref) (_mResponse m)
299− ss = InsType noLoc (TyApp (TyCon "Scopes") (tycon n)) $
300+ ss = InsType () (TyApp () (TyCon () "Scopes") (tycon n)) $
300− TyPromoted $
301+ TyPromoted () $
301− PromotedList True $
302+ PromotedList () True $
302− map (TyPromoted . PromotedString . Text.unpack) (_mScopes m)
303+ map (\m' -> TyPromoted () (PromotedString () (Text.unpack m') "Scopes")) (_mScopes m)
304 extras = catMaybes [alt, payload]
305 extras = catMaybes [alt, payload]
@@ -312,35 +313,35 @@ requestDecl n pre api url fs m =
313 pat = metadataPat m
314 pat = metadataPat m
315− prec = PRec (UnQual (dname' n)) [PFieldWildcard | not (null fs)]
316+ prec = PRec () (UnQual () (dname' n)) [PFieldWildcard () | not (null fs)]
317−googleRequestDecl :: Type
318+googleRequestDecl :: Type ()
318− -> [InstDecl]
319+ -> [InstDecl ()]
319− -> [Exp]
320+ -> [Exp ()]
320 -> Prefix
321 -> Prefix
321− -> Name
322+ -> Name ()
322− -> Name
323+ -> Name ()
323 -> Method Solved
324 -> Method Solved
324− -> Pat
325+ -> Pat ()
325− -> Pat
326+ -> Pat ()
326− -> Decl
327+ -> Decl ()
327googleRequestDecl n assoc extras pre api url m pat prec =
328googleRequestDecl n assoc extras pre api url m pat prec =
328− InstDecl noLoc Nothing [] [] (unqual "GoogleRequest") [n] (assoc ++ [request])
329+ InstDecl () Nothing (instrule "GoogleRequest" n) (Just (assoc ++ [request]))
330− request = InsDecl (FunBind [match])
331+ request = InsDecl () (FunBind () [match])
332− match = Match noLoc (name "requestClient") [prec] Nothing rhs (Just decls)
333+ match = Match () (name "requestClient") [prec] rhs (Just decls)
334− decls = BDecls
335+ decls = BDecls ()
335− [ patBind noLoc pat $
336+ [ patBind pat $
336− appFun (var "buildClient") $
337+ appFun (var "buildClient")
337− [ ExpTypeSig noLoc (var "Proxy") $
338+ [ ExpTypeSig () (var "Proxy") $
338− TyApp (TyCon "Proxy") (TyCon (UnQual api))
339+ TyApp () (TyCon () "Proxy") (TyCon () (UnQual () api))
339 , var "mempty"
340 , var "mempty"
343− rhs = UnGuardedRhs . appFun (var "go") $ map go fs ++ extras ++ [var url]
344+ rhs = UnGuardedRhs () . appFun (var "go") $ map go fs ++ extras ++ [var url]
345 go l = case Map.lookup l ps of
346 go l = case Map.lookup l ps of
346 Just p | _pLocation p == Query
347 Just p | _pLocation p == Query
@@ -365,16 +366,15 @@ googleRequestDecl n assoc extras pre api url m pat prec =
366 $ map fst (rights (extractPath (_mPath m))) ++ _mParameterOrder m
367 $ map fst (rights (extractPath (_mPath m))) ++ _mParameterOrder m
368−jsonDecls :: Global -> Prefix -> Map Local Solved -> [Decl]
369+jsonDecls :: Global -> Prefix -> Map Local Solved -> [Decl ()]
369jsonDecls g p (Map.toList -> rs) = [from', to']
370jsonDecls g p (Map.toList -> rs) = [from', to']
371− from' = InstDecl noLoc Nothing [] [] (unqual "FromJSON") [tycon g]
372+ from' = InstDecl () Nothing (instrule "FromJSON" (tycon g)) (Just
372 [ funD "parseJSON" $
373 [ funD "parseJSON" $
373 app (app (var "withObject") (dstr g)) $
374 app (app (var "withObject") (dstr g)) $
374− lamE noLoc [pvar "o"] $
375+ lamE [pvar "o"] $
375 ctorE g (map decode rs)
376 ctorE g (map decode rs)
378 decode (l, s)
378 decode (l, s)
379 | _additional s = app (var "parseJSONObject") (var "o")
379 | _additional s = app (var "parseJSONObject") (var "o")
380 | Just x <- def s = defJS l x
380 | Just x <- def s = defJS l x
@@ -384,15 +384,15 @@ jsonDecls g p (Map.toList -> rs) = [from', to']
385 to' = case rs of
385 to' = case rs of
386 [(k, v)] | _additional v ->
386 [(k, v)] | _additional v ->
387− InstDecl noLoc Nothing [] [] (unqual "ToJSON") [tycon g]
387+ InstDecl () Nothing (instrule "ToJSON" (tycon g)) (Just
388 [ funD "toJSON" $
388 [ funD "toJSON" $
389 infixApp (var "toJSON") "." (var (fname p k))
389 infixApp (var "toJSON") "." (var (fname p k))
393− InstDecl noLoc Nothing [] [] (unqual "ToJSON") [tycon g]
393+ InstDecl () Nothing (instrule "ToJSON" (tycon g)) (Just
394 [ wildcardD "toJSON" g omit emptyObj (map encode rs)
394 [ wildcardD "toJSON" g omit emptyObj (map encode rs)
397 omit = app (var "object")
397 omit = app (var "object")
398 . app (var "catMaybes")
398 . app (var "catMaybes")
@@ -410,81 +410,99 @@ jsonDecls g p (Map.toList -> rs) = [from', to']
411wildcardD :: String
411wildcardD :: String
412 -> Global
412 -> Global
413− -> ([Exp] -> Exp)
413+ -> ([Exp ()] -> Exp ())
414− -> Exp
414+ -> Exp ()
415− -> [Exp]
415+ -> [Exp ()]
416− -> InstDecl
416+ -> InstDecl ()
417wildcardD f n enc x = \case
417wildcardD f n enc x = \case
418 [] -> constD f x
418 [] -> constD f x
419− xs -> InsDecl (FunBind [match prec xs])
419+ xs -> InsDecl () (FunBind () [match prec xs])
421 match p es =
421 match p es =
422− Match noLoc (name f) [p] Nothing (UnGuardedRhs (enc es)) noBinds
422+ Match () (name f) [p] (UnGuardedRhs () (enc es)) noBinds
424− prec = PRec (UnQual (dname' n)) [PFieldWildcard]
424+ prec = PRec () (UnQual () (dname' n)) [PFieldWildcard ()]
426−defJS :: Local -> Exp -> Exp
426+defJS :: Local -> Exp () -> Exp ()
427−defJS n x = infixApp (infixApp (var "o") ".:?" (fstr n)) ".!=" x
427+defJS n = infixApp (infixApp (var "o") ".:?" (fstr n)) ".!="
429−reqJS :: Local -> Exp
429+reqJS :: Local -> Exp ()
430reqJS = infixApp (var "o") ".:" . fstr
430reqJS = infixApp (var "o") ".:" . fstr
432−optJS :: Local -> Exp
432+optJS :: Local -> Exp ()
433optJS = infixApp (var "o") ".:?" . fstr
433optJS = infixApp (var "o") ".:?" . fstr
435−funD :: String -> Exp -> InstDecl
435+funD :: String -> Exp () -> InstDecl ()
436−funD f = InsDecl . patBind noLoc (pvar (name f))
436+funD f = InsDecl () . patBind (pvar (name f))
438−constD :: String -> Exp -> InstDecl
438+constD :: String -> Exp () -> InstDecl ()
439−constD f x = InsDecl $
439+constD f x = InsDecl () $
440− sfun noLoc (name f) [] (UnGuardedRhs (app (var "const") x)) noBinds
440+ sfun (name f) [] (UnGuardedRhs () (app (var "const") x)) noBinds
442−ctorE :: Global -> [Exp] -> Exp
442+ctorE :: Global -> [Exp ()] -> Exp ()
443ctorE n = seqE (var (dname' n)) . map paren
443ctorE n = seqE (var (dname' n)) . map paren
445−seqE :: Exp -> [Exp] -> Exp
445+seqE :: Exp () -> [Exp ()] -> Exp ()
446seqE l [] = app (var "pure") l
446seqE l [] = app (var "pure") l
447seqE l (r:rs) = infixApp l "<$>" (infixE r "<*>" rs)
447seqE l (r:rs) = infixApp l "<$>" (infixE r "<*>" rs)
449−objDecl :: Global -> Prefix -> [Derive] -> Map Local Solved -> Decl
449+objDecl :: Global -> Prefix -> [Derive] -> Map Local Solved -> Decl ()
450objDecl n p ds rs =
450objDecl n p ds rs =
451− DataDecl noLoc arity [] (dname n) [] [conDecl (dname' n) p rs] (der ds)
451+ DataDecl () arity Nothing (DHead () (dname n)) [conDecl (dname' n) p rs] [der ds]
453− arity | Map.size rs == 1 = NewType
453+ arity | Map.size rs == 1 = NewType ()
454− | otherwise = DataType
454+ | otherwise = DataType ()
456− der = map ((,[]) . unqual . drop 1 . show)
456+ der = Deriving () Nothing . map (unqualrule . drop 1 . show)
463+-- (DHead () (Ident () "AboutGet"))
464+-- [QualConDecl () Nothing Nothing (ConDecl () (Ident () "AboutGet'") [])]
468+-- [ IRule () Nothing Nothing (IHCon () (UnQual () (Ident () "Eq")))
469+-- , IRule () Nothing Nothing (IHCon () (UnQual () (Ident () "Show")))
470+-- , IRule () Nothing Nothing (IHCon () (UnQual () (Ident () "Data")))
471+-- , IRule () Nothing Nothing (IHCon () (UnQual () (Ident () "Typeable")))
472+-- , IRule () Nothing Nothing (IHCon () (UnQual () (Ident () "Generic")))
458−conDecl :: Name -> Prefix -> Map Local Solved -> QualConDecl
476+conDecl :: Name () -> Prefix -> Map Local Solved -> QualConDecl ()
459−conDecl n p rs = QualConDecl noLoc [] [] body
477+conDecl n p rs = QualConDecl () Nothing Nothing body
461 body = case Map.toList rs of
479 body = case Map.toList rs of
462− [] -> ConDecl n []
480+ [] -> ConDecl () n []
463− [x] -> RecDecl n [field internalType x]
481+ [x] -> RecDecl () n [field internalType x]
464− xs -> RecDecl n (map (field (strict . internalType)) xs)
482+ xs -> RecDecl () n (map (field (strict . internalType)) xs)
466− field f (l, v) = ([fname p l], f (_type v))
484+ field f (l, v) = FieldDecl () [fname p l] (f (_type v))
468−ctorSig :: Global -> Map Local Solved -> Decl
486+ctorSig :: Global -> Map Local Solved -> Decl ()
469−ctorSig n rs = TypeSig noLoc [cname n] ts
487+ctorSig n rs = TypeSig () [cname n] ts
471− ts = foldr' TyFun (TyCon (UnQual (dname n))) ps
489+ ts = foldr' (TyFun ()) (TyCon () (UnQual () (dname n))) ps
472 ps = parameters (Map.elems rs)
490 ps = parameters (Map.elems rs)
474−ctorDecl :: Global -> Prefix -> Map Local Solved -> Decl
492+ctorDecl :: Global -> Prefix -> Map Local Solved -> Decl ()
475−ctorDecl n p rs = sfun noLoc c ps (UnGuardedRhs rhs) noBinds
493+ctorDecl n p rs = sfun c ps (UnGuardedRhs () rhs) noBinds
477 c = cname n
495 c = cname n
478 d = dname' n
496 d = dname' n
480 rhs | Map.null rs = var d
498 rhs | Map.null rs = var d
481− | otherwise = RecConstr (UnQual d) $
499+ | otherwise = RecConstr () (UnQual () d) $
482 map (uncurry (fieldUpdate p)) (Map.toList rs)
500 map (uncurry (fieldUpdate p)) (Map.toList rs)
484 ps = map (pname p) . Map.keys $ Map.filter parameter rs
502 ps = map (pname p) . Map.keys $ Map.filter parameter rs
486−fieldUpdate :: Prefix -> Local -> Solved -> FieldUpdate
504+fieldUpdate :: Prefix -> Local -> Solved -> FieldUpdate ()
487−fieldUpdate p l s = FieldUpdate (UnQual (fname p l)) rhs
505+fieldUpdate p l s = FieldUpdate () (UnQual () (fname p l)) rhs
489 rhs | Just x <- def s, s ^. iRepeated = listE [x]
507 rhs | Just x <- def s, s ^. iRepeated = listE [x]
490 | Just x <- def s = x
508 | Just x <- def s = x
@@ -494,26 +512,26 @@ fieldUpdate p l s = FieldUpdate (UnQual (fname p l)) rhs
495 v = var (pname p l)
513 v = var (pname p l)
497−lensSig :: Global -> Prefix -> Local -> Solved -> Decl
515+lensSig :: Global -> Prefix -> Local -> Solved -> Decl ()
498−lensSig n p l s = TypeSig noLoc [lname p l] $
516+lensSig n p l s = TypeSig () [lname p l] $
499− TyApp (TyApp (TyCon "Lens'") (tycon n))
517+ TyApp () (TyApp () (TyCon () "Lens'") (tycon n))
500 (externalType (_type s))
518 (externalType (_type s))
502−lensDecl :: Prefix -> Local -> Solved -> Decl
520+lensDecl :: Prefix -> Local -> Solved -> Decl ()
503−lensDecl p l s = sfun noLoc (lname p l) [] (UnGuardedRhs rhs) noBinds
521+lensDecl p l s = sfun (lname p l) [] (UnGuardedRhs () rhs) noBinds
505 f = fname p l
523 f = fname p l
506 t = _type s
524 t = _type s
508 rhs = mapping t $
526 rhs = mapping t $
509 app (app (var "lens") (var f))
527 app (app (var "lens") (var f))
510− (paren (lamE noLoc [pvar "s", pvar "a"]
528+ (paren (lamE [pvar "s", pvar "a"]
511− (RecUpdate (var "s") [FieldUpdate (UnQual f) (var "a")])))
529+ (RecUpdate () (var "s") [FieldUpdate () (UnQual () f) (var "a")])))
513−parameters :: [Solved] -> [Type]
531+parameters :: [Solved] -> [Type ()]
514parameters = map (externalType . _type) . filter parameter
532parameters = map (externalType . _type) . filter parameter
516−def :: Solved -> Maybe Exp
534+def :: Solved -> Maybe (Exp ())
518 | Just x <- s ^. iDefault = Just (go x (_prefix s) (_schema s))
536 | Just x <- s ^. iDefault = Just (go x (_prefix s) (_schema s))
519 | otherwise = Nothing
537 | otherwise = Nothing
@@ -527,88 +545,88 @@ def s
528 lit = var . name . Text.unpack
546 lit = var . name . Text.unpack
530−terminalType :: TType -> Type
548+terminalType :: TType -> Type ()
531terminalType = internalType . go
549terminalType = internalType . go
533 go (TMaybe x) = go x
551 go (TMaybe x) = go x
534 go (TList x) = go x
552 go (TList x) = go x
537−externalType :: TType -> Type
555+externalType :: TType -> Type ()
538externalType = \case
556externalType = \case
539 TType r -> tycon r
557 TType r -> tycon r
540 TMaybe t@TList {} -> externalType t
558 TMaybe t@TList {} -> externalType t
541− TMaybe t -> TyApp (TyCon "Maybe") (externalType t)
559+ TMaybe t -> TyApp () (TyCon () "Maybe") (externalType t)
542− TList t -> TyList (externalType t)
560+ TList t -> TyList () (externalType t)
543 TLit l -> externalLit l
561 TLit l -> externalLit l
544 TMap k v ->
562 TMap k v ->
545− TyApp (TyApp (TyCon "HashMap") (externalType k)) (externalType (require v))
563+ TyApp () (TyApp () (TyCon () "HashMap") (externalType k)) (externalType (require v))
547−internalType :: TType -> Type
565+internalType :: TType -> Type ()
548internalType = \case
566internalType = \case
549 TType r -> tycon r
567 TType r -> tycon r
550− TMaybe t -> TyApp (TyCon "Maybe") (internalType t)
568+ TMaybe t -> TyApp () (TyCon () "Maybe") (internalType t)
551− TList t -> TyList (internalType t)
569+ TList t -> TyList () (internalType t)
552 TLit l -> internalLit l
570 TLit l -> internalLit l
553 TMap k v ->
571 TMap k v ->
554− TyApp (TyApp (TyCon "HashMap") (internalType k)) (internalType (require v))
572+ TyApp () (TyApp () (TyCon () "HashMap") (internalType k)) (internalType (require v))
556−externalLit :: Lit -> Type
574+externalLit :: Lit -> Type ()
557externalLit = \case
575externalLit = \case
558− Text -> TyCon "Text"
576+ Text -> TyCon () "Text"
559− Bool -> TyCon "Bool"
577+ Bool -> TyCon () "Bool"
560− Time -> TyCon "TimeOfDay"
578+ Time -> TyCon () "TimeOfDay"
561− Date -> TyCon "Day"
579+ Date -> TyCon () "Day"
562− DateTime -> TyCon "UTCTime"
580+ DateTime -> TyCon () "UTCTime"
563− Nat -> TyCon "Natural"
581+ Nat -> TyCon () "Natural"
564− Float -> TyCon "Double"
582+ Float -> TyCon () "Double"
565− Double -> TyCon "Double"
583+ Double -> TyCon () "Double"
566− Byte -> TyCon "ByteString"
584+ Byte -> TyCon () "ByteString"
567− UInt32 -> TyCon "Word32"
585+ UInt32 -> TyCon () "Word32"
568− UInt64 -> TyCon "Word64"
586+ UInt64 -> TyCon () "Word64"
569− Int32 -> TyCon "Int32"
587+ Int32 -> TyCon () "Int32"
570− Int64 -> TyCon "Int64"
588+ Int64 -> TyCon () "Int64"
571− Alt t -> TyCon (unqual (Text.unpack t))
589+ Alt t -> TyCon () (unqual (Text.unpack t))
572− RqBody -> TyCon "RequestBody"
590+ RqBody -> TyCon () "RequestBody"
573− RsBody -> TyCon "Stream"
591+ RsBody -> TyCon () "Stream"
574− JSONValue -> TyCon "JSONValue"
592+ JSONValue -> TyCon () "JSONValue"
575− GFieldMask -> TyCon "GFieldMask"
593+ GFieldMask -> TyCon () "GFieldMask"
576− GDuration -> TyCon "Scientific"
594+ GDuration -> TyCon () "Scientific"
578−internalLit :: Lit -> Type
596+internalLit :: Lit -> Type ()
579internalLit = \case
597internalLit = \case
580− Text -> TyCon "Text"
598+ Text -> TyCon () "Text"
581− Bool -> TyCon "Bool"
599+ Bool -> TyCon () "Bool"
582− Time -> TyCon "Time'"
600+ Time -> TyCon () "Time'"
583− Date -> TyCon "Date'"
601+ Date -> TyCon () "Date'"
584− DateTime -> TyCon "DateTime'"
602+ DateTime -> TyCon () "DateTime'"
585− Nat -> TyApp (TyCon "Textual") (TyCon "Nat")
603+ Nat -> TyApp () (TyCon () "Textual") (TyCon () "Nat")
586− Float -> TyApp (TyCon "Textual") (TyCon "Double")
604+ Float -> TyApp () (TyCon () "Textual") (TyCon () "Double")
587− Double -> TyApp (TyCon "Textual") (TyCon "Double")
605+ Double -> TyApp () (TyCon () "Textual") (TyCon () "Double")
588− Byte -> TyCon "Bytes"
606+ Byte -> TyCon () "Bytes"
589− UInt32 -> TyApp (TyCon "Textual") (TyCon "Word32")
607+ UInt32 -> TyApp () (TyCon () "Textual") (TyCon () "Word32")
590− UInt64 -> TyApp (TyCon "Textual") (TyCon "Word64")
608+ UInt64 -> TyApp () (TyCon () "Textual") (TyCon () "Word64")
591− Int32 -> TyApp (TyCon "Textual") (TyCon "Int32")
609+ Int32 -> TyApp () (TyCon () "Textual") (TyCon () "Int32")
592− Int64 -> TyApp (TyCon "Textual") (TyCon "Int64")
610+ Int64 -> TyApp () (TyCon () "Textual") (TyCon () "Int64")
593− Alt t -> TyCon (unqual (Text.unpack t))
611+ Alt t -> TyCon () (unqual (Text.unpack t))
594− RqBody -> TyCon "RequestBody"
612+ RqBody -> TyCon () "RequestBody"
595− RsBody -> TyCon "Stream"
613+ RsBody -> TyCon () "Stream"
596− JSONValue -> TyCon "JSONValue"
614+ JSONValue -> TyCon () "JSONValue"
597− GFieldMask -> TyCon "GFieldMask"
615+ GFieldMask -> TyCon () "GFieldMask"
598− GDuration -> TyCon "GDuration"
616+ GDuration -> TyCon () "GDuration"
600−mapping :: TType -> Exp -> Exp
618+mapping :: TType -> Exp () -> Exp ()
601mapping t e = infixE e "." (go t)
619mapping t e = infixE e "." (go t)
603 go = \case
621 go = \case
604− TMaybe x@(TList {}) -> var "_Default" : go x
622+ TMaybe x@TList {} -> var "_Default" : go x
605− TMaybe x -> nest (go x)
623+ TMaybe x -> nest (go x)
606− x -> maybeToList (iso x)
624+ x -> maybeToList (iso x)
608 nest [] = []
626 nest [] = []
609 nest (x:xs) = [app (var "mapping") (infixE x "." xs)]
627 nest (x:xs) = [app (var "mapping") (infixE x "." xs)]
611−iso :: TType -> Maybe Exp
629+iso :: TType -> Maybe (Exp ())
612iso = \case
630iso = \case
613 TList {} -> Just (var "_Coerce")
631 TList {} -> Just (var "_Coerce")
614 TMap {} -> Just (var "_Coerce")
632 TMap {} -> Just (var "_Coerce")
@@ -630,27 +648,33 @@ require :: TType -> TType
630require (TMaybe t) = t
648require (TMaybe t) = t
631require t = t
649require t = t
633−strict :: Type -> Type
651+strict :: Type () -> Type ()
634−strict = TyBang BangedTy . \case
652+strict = TyBang () (BangedTy ()) (NoUnpackPragma ()) . \case
635− t@TyApp{} -> TyParen t
653+ t@TyApp{} -> TyParen () t
638−sing :: Text -> Type
656+sing :: Text -> Type ()
639−sing = TyCon . unqual . Text.unpack . flip mappend "\"" . mappend "\""
657+sing = TyCon () . unqual . Text.unpack . flip mappend "\"" . mappend "\""
641−tylist :: [Text] -> Type
659+tylist :: [Text] -> Type ()
642−tylist xs = TyCon . UnQual . name . Text.unpack $
660+tylist xs = TyCon () . UnQual () . name . Text.unpack $
643 "'[" <> Text.intercalate ", " xs <> "]"
661 "'[" <> Text.intercalate ", " xs <> "]"
645−tycon :: Global -> Type
663+tycon :: Global -> Type ()
646−tycon = TyCon . UnQual . dname
664+tycon = TyCon () . UnQual () . dname
666+unqual :: String -> QName ()
667+unqual = UnQual () . name
669+unqualrule :: String -> InstRule ()
670+unqualrule = IRule () Nothing Nothing . IHCon () . unqual
648−unqual :: String -> QName
672+instrule :: String -> Type () -> InstRule ()
649−unqual = UnQual . name
673+instrule n t = IRule () Nothing Nothing (IHApp () (IHCon () (unqual n)) t)
651−infixE :: Exp -> QOp -> [Exp] -> Exp
675+infixE :: Exp () -> QOp () -> [Exp ()] -> Exp ()
652infixE l _ [] = l
676infixE l _ [] = l
653infixE l o (r:rs) = infixE (infixApp l o r) o rs
677infixE l o (r:rs) = infixE (infixApp l o r) o rs
655−str :: Text -> Exp
679+str :: Text -> Exp ()
656str = strE . Text.unpack
680str = strE . Text.unpack