git.iko.soy/rowtype-yoga/purescript-prospero
on main help sign in
commitcf2def9811bf8d7aece85458ee958fd3449329f1 authorMark <mark.eibes@gmail.com> dateFri 20 Feb 2026, 18:15 (7 months ago) parent587c0d0
4 files changed+20−15
test/Dev.purs+6−4 test/Example.purs+2−2 test/Example/Types.purs+3−2 test/Main.purs+9−7
test/Dev.purs+6−4
@@ -6,6 +6,7 @@ import Data.Array (elem, filter, head)
66import Data.Generic.Rep (class Generic)
77import Data.Maybe (Maybe(..))
88import Data.Newtype (class Newtype, un)
9+import Data.Variant (Variant)
910import Data.String (Pattern(..), contains, toLower)
1011import Effect (Effect)
1112import Effect.Aff (Aff, launchAff_)
@@ -17,6 +18,7 @@ import Effect.Ref (Ref)
1718import Effect.Ref as Ref
1819import Prospero (class IsGql, class FromInputValue, Object, Enum, Union, Interface, Scalar, GraphQL, ID(..), genericFromInputValue, runServeGraphQL)
1920import Prospero.RootResolver (mkGraphQLWithMutations)
21+import Prospero.VariantHelper (tag)
2022import Yoga.Fastify.Fastify as F
2123import Yoga.Om (Om, ask)
2224
@@ -111,9 +113,9 @@ instance IsGql Object "Comment" Comment
111113
112114-- Unions
113115
114−data SearchResult = UserResult User | PostResult Post | CommentResult Comment
116+newtype SearchResult = SearchResult (Variant (User :: User, Post :: Post, Comment :: Comment))
115117
116−derive instance Generic SearchResult _
118+derive instance Newtype SearchResult _
117119instance IsGql Union "SearchResult" SearchResult
118120
119121-- Data
@@ -360,8 +362,8 @@ queries =
360362 , comments: pure allComments
361363 , search: \{ term } -> do
362364 let t = toLower term
363− let matchingUsers = filter (\u -> contains (Pattern t) (toLower (un User u).name)) users # map UserResult
364− let matchingPosts = filter (\p -> contains (Pattern t) (toLower (un Post p).title)) posts # map PostResult
365+ let matchingUsers = filter (\u -> contains (Pattern t) (toLower (un User u).name)) users # map (tag @"User")
366+ let matchingPosts = filter (\p -> contains (Pattern t) (toLower (un Post p).title)) posts # map (tag @"Post")
365367 pure (matchingUsers <> matchingPosts)
366368 , node: \{ id: targetId } -> do
367369 let
test/Example.purs+2−2
@@ -217,8 +217,8 @@ schema newPostSource =
217217 allUsers <- userRepo.findAll # toOm
218218 allPosts <- postRepo.findAll # toOm
219219 let t = toLower term
220− let matchingUsers = filter (\u -> contains (Pattern t) (toLower (un User u).name)) allUsers <#> UserResult
221− let matchingPosts = filter (\p -> contains (Pattern t) (toLower (un Post p).title)) allPosts <#> PostResult
220+ let matchingUsers = filter (\u -> contains (Pattern t) (toLower (un User u).name)) allUsers <#> tag @"User"
221+ let matchingPosts = filter (\p -> contains (Pattern t) (toLower (un Post p).title)) allPosts <#> tag @"Post"
222222 pure (matchingUsers <> matchingPosts)
223223
224224 addUser { name, email } = do
test/Example/Types.purs+3−2
@@ -4,6 +4,7 @@ import Prelude
44
55import Data.Generic.Rep (class Generic)
66import Data.Newtype (class Newtype)
7+import Data.Variant (Variant)
78import Prospero.InputValue (class FromInputValue)
89import Prospero.Metadata (class IsGql, Enum, Object, Scalar, Union)
910import Prospero.Schema (genericFromInputValue)
@@ -58,7 +59,7 @@ mkPost title author = Post { title, name: author, author }
5859
5960-- Unions
6061
61−data SearchResult = UserResult User | PostResult Post
62+newtype SearchResult = SearchResult (Variant (User :: User, Post :: Post))
6263
63−derive instance Generic SearchResult _
64+derive instance Newtype SearchResult _
6465instance IsGql Union "SearchResult" SearchResult
test/Main.purs+9−7
@@ -3,6 +3,7 @@ module Test.Main where
33import Prelude
44
55import Data.Generic.Rep (class Generic)
6+import Data.Variant (Variant)
67import Data.Array as Array
78import Data.Map as Map
89import Foreign (unsafeToForeign)
@@ -52,6 +53,7 @@ import Prospero.ResponseValue (ResponseValue(..))
5253import Prospero.RootResolver (GraphQL, graphql, mkGraphQL, mkGraphQL', mkGraphQLWithMutations, mkGraphQLWithSubscriptions, withFederation, executeQuery, executeOperation)
5354import Prospero.Federation (EntityResolvers)
5455import Prospero.Step (Step(..))
56+import Prospero.VariantHelper (tag)
5557import Test.Spec (describe, it)
5658import Test.Spec.Assertions (fail, shouldEqual)
5759import Test.Spec.Reporter.Console (consoleReporter)
@@ -96,9 +98,9 @@ instance FromInputValue Episode where
9698
9799instance IsGql Enum "Episode" Episode
98100
99−data SearchResult = AsHuman Character | AsDroid Character
101+newtype SearchResult = SearchResult (Variant (Character :: Character))
100102
101−derive instance Generic SearchResult _
103+derive instance Newtype SearchResult _
102104
103105instance IsGql Union "SearchResult" SearchResult
104106
@@ -112,9 +114,9 @@ newtype Droid = Droid { name :: String, primaryFunction :: String }
112114derive instance Newtype Droid _
113115instance IsGql Object "Droid" Droid
114116
115−data ClientSearchResult = HumanResult Human | DroidResult Droid
117+newtype ClientSearchResult = ClientSearchResult (Variant (Human :: Human, Droid :: Droid))
116118
117−derive instance Generic ClientSearchResult _
119+derive instance Newtype ClientSearchResult _
118120instance IsGql Union "ClientSearchResult" ClientSearchResult
119121
120122type Queries ctx errs =
@@ -144,7 +146,7 @@ enumSchema :: forall gql. GraphQL Ctx Errs gql
144146enumSchema = mkGraphQL { episode: pure Empire :: Om Ctx Errs Episode }
145147
146148unionSchema :: forall gql. GraphQL Ctx Errs gql
147−unionSchema = mkGraphQL { search: pure (AsDroid bob) :: Om Ctx Errs SearchResult }
149+unionSchema = mkGraphQL { search: pure (tag @"Character" bob) :: Om Ctx Errs SearchResult }
148150
149151testResolve :: Character -> Step Ctx Errs
150152testResolve = resolve
@@ -499,7 +501,7 @@ main = launchAff_ $ runSpec [ consoleReporter ] do
499501
500502 describe "Unions" do
501503 it "resolves union member" do
502− let step = resolve @Ctx @Errs (AsHuman alice)
504+ let step = resolve @Ctx @Errs (tag @"Character" alice :: SearchResult)
503505 result <- runTestOm $ executeStep [] [ field "name" [] ] step
504506 result `shouldEqual` ObjectValue
505507 (Object.fromHomogeneous { name: StringValue "Alice" })
@@ -521,7 +523,7 @@ main = launchAff_ $ runSpec [ consoleReporter ] do
521523 , " search: SearchResult!"
522524 , "}"
523525 ]
524− , "union SearchResult = Character | Character"
526+ , "union SearchResult = Character"
525527 ]
526528
527529 describe "Introspection" do