mu-schema 0.3.1.0 → 0.3.1.1
raw patch · 3 files changed
+88/−48 lines, 3 filesdep +first-class-familiesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: first-class-families
API changes (from Hackage documentation)
- Mu.Schema.Class: instance Mu.Schema.Class.GFromSchemaEnumU1 (GHC.Generics.C1 m GHC.Generics.U1 GHC.Generics.:+: rest) 'Mu.Schema.Class.Here
- Mu.Schema.Class: instance Mu.Schema.Class.GFromSchemaEnumU1 (GHC.Generics.C1 m GHC.Generics.U1) 'Mu.Schema.Class.Here
- Mu.Schema.Class: instance Mu.Schema.Class.GFromSchemaEnumU1 rest w => Mu.Schema.Class.GFromSchemaEnumU1 (other GHC.Generics.:+: rest) ('Mu.Schema.Class.There w)
- Mu.Schema.Class: instance forall ts fs (sch :: Mu.Schema.Definition.Schema ts fs) (t :: Mu.Schema.Definition.FieldType ts) (other :: * -> *) (rest :: * -> *) (n :: Mu.Schema.Class.Where). Mu.Schema.Class.GToSchemaRecordSearch sch t rest n => Mu.Schema.Class.GToSchemaRecordSearch sch t (other GHC.Generics.:*: rest) ('Mu.Schema.Class.There n)
- Mu.Schema.Class: instance forall ts fs (sch :: Mu.Schema.Definition.Schema ts fs) (t :: Mu.Schema.Definition.FieldType ts) v (m :: GHC.Generics.Meta) i (other :: * -> *) (rest :: * -> *). Mu.Schema.Class.GToSchemaFieldType sch t v => Mu.Schema.Class.GToSchemaRecordSearch sch t ((GHC.Generics.S1 m (GHC.Generics.K1 i v) GHC.Generics.:*: other) GHC.Generics.:*: rest) 'Mu.Schema.Class.HereLeft
- Mu.Schema.Class: instance forall ts fs (sch :: Mu.Schema.Definition.Schema ts fs) (t :: Mu.Schema.Definition.FieldType ts) v (m :: GHC.Generics.Meta) i (rest :: * -> *). Mu.Schema.Class.GToSchemaFieldType sch t v => Mu.Schema.Class.GToSchemaRecordSearch sch t (GHC.Generics.S1 m (GHC.Generics.K1 i v) GHC.Generics.:*: rest) 'Mu.Schema.Class.Here
- Mu.Schema.Class: instance forall ts fs (sch :: Mu.Schema.Definition.Schema ts fs) (t :: Mu.Schema.Definition.FieldType ts) v (m :: GHC.Generics.Meta) i. Mu.Schema.Class.GToSchemaFieldType sch t v => Mu.Schema.Class.GToSchemaRecordSearch sch t (GHC.Generics.S1 m (GHC.Generics.K1 i v)) 'Mu.Schema.Class.Here
- Mu.Schema.Class: instance forall ts fs (sch :: Mu.Schema.Definition.Schema ts fs) (t :: Mu.Schema.Definition.FieldType ts) v (other :: * -> *) (m :: GHC.Generics.Meta) i (rest :: * -> *). Mu.Schema.Class.GToSchemaFieldType sch t v => Mu.Schema.Class.GToSchemaRecordSearch sch t ((other GHC.Generics.:*: GHC.Generics.S1 m (GHC.Generics.K1 i v)) GHC.Generics.:*: rest) 'Mu.Schema.Class.HereRight
- Mu.Schema.Class: instance forall ts fs (sch :: Mu.Schema.Definition.Schema ts fs) (t :: Mu.Schema.Definition.FieldType ts) v (other1 :: * -> *) (m :: GHC.Generics.Meta) i (other2 :: * -> *) (rest :: * -> *). Mu.Schema.Class.GToSchemaFieldType sch t v => Mu.Schema.Class.GToSchemaRecordSearch sch t ((other1 GHC.Generics.:*: (GHC.Generics.S1 m (GHC.Generics.K1 i v) GHC.Generics.:*: other2)) GHC.Generics.:*: rest) 'Mu.Schema.Class.HereRightThenLeft
- Mu.Schema.Class: instance forall ts fs (sch :: Mu.Schema.Definition.Schema ts fs) (t :: Mu.Schema.Definition.FieldType ts) v (other1 :: * -> *) (other2 :: * -> *) (m :: GHC.Generics.Meta) i (rest :: * -> *). Mu.Schema.Class.GToSchemaFieldType sch t v => Mu.Schema.Class.GToSchemaRecordSearch sch t ((other1 GHC.Generics.:*: (other2 GHC.Generics.:*: GHC.Generics.S1 m (GHC.Generics.K1 i v))) GHC.Generics.:*: rest) 'Mu.Schema.Class.HereTwoRights
+ Mu.Schema.Class: instance Mu.Schema.Class.GFromSchemaEnumU1 (GHC.Generics.C1 m GHC.Generics.U1) '[ 'Mu.Schema.Class.StepNoMore]
+ Mu.Schema.Class: instance Mu.Schema.Class.GFromSchemaEnumU1 left rest => Mu.Schema.Class.GFromSchemaEnumU1 (left GHC.Generics.:+: right) ('Mu.Schema.Class.StepLeft : rest)
+ Mu.Schema.Class: instance Mu.Schema.Class.GFromSchemaEnumU1 right rest => Mu.Schema.Class.GFromSchemaEnumU1 (left GHC.Generics.:+: right) ('Mu.Schema.Class.StepRight : rest)
+ Mu.Schema.Class: instance forall ts fs (sch :: Mu.Schema.Definition.Schema ts fs) (t :: Mu.Schema.Definition.FieldType ts) (left :: * -> *) (right :: * -> *) (n :: [Mu.Schema.Class.WhereStep]). Mu.Schema.Class.GToSchemaRecordSearch sch t left n => Mu.Schema.Class.GToSchemaRecordSearch sch t (left GHC.Generics.:*: right) ('Mu.Schema.Class.StepLeft : n)
+ Mu.Schema.Class: instance forall ts fs (sch :: Mu.Schema.Definition.Schema ts fs) (t :: Mu.Schema.Definition.FieldType ts) (left :: * -> *) (right :: * -> *) (n :: [Mu.Schema.Class.WhereStep]). Mu.Schema.Class.GToSchemaRecordSearch sch t right n => Mu.Schema.Class.GToSchemaRecordSearch sch t (left GHC.Generics.:*: right) ('Mu.Schema.Class.StepRight : n)
+ Mu.Schema.Class: instance forall ts fs (sch :: Mu.Schema.Definition.Schema ts fs) (t :: Mu.Schema.Definition.FieldType ts) v (m :: GHC.Generics.Meta) i. Mu.Schema.Class.GToSchemaFieldType sch t v => Mu.Schema.Class.GToSchemaRecordSearch sch t (GHC.Generics.S1 m (GHC.Generics.K1 i v)) '[ 'Mu.Schema.Class.StepNoMore]
+ Mu.Schema.Examples: Gender0 :: Gender
+ Mu.Schema.Examples: Gender1 :: Gender
+ Mu.Schema.Examples: Gender2 :: Gender
+ Mu.Schema.Examples: Gender3 :: Gender
+ Mu.Schema.Examples: Gender4 :: Gender
+ Mu.Schema.Examples: Gender5 :: Gender
+ Mu.Schema.Examples: Gender6 :: Gender
+ Mu.Schema.Examples: Gender7 :: Gender
+ Mu.Schema.Examples: Gender8 :: Gender
+ Mu.Schema.Examples: Gender9 :: Gender
+ Mu.Schema.Examples: GenderMsgGender0 :: GenderMsg f_ayDC
+ Mu.Schema.Examples: GenderMsgGender1 :: GenderMsg f_ayDC
+ Mu.Schema.Examples: GenderMsgGender2 :: GenderMsg f_ayDC
+ Mu.Schema.Examples: GenderMsgGender3 :: GenderMsg f_ayDC
+ Mu.Schema.Examples: GenderMsgGender4 :: GenderMsg f_ayDC
+ Mu.Schema.Examples: GenderMsgGender5 :: GenderMsg f_ayDC
+ Mu.Schema.Examples: GenderMsgGender6 :: GenderMsg f_ayDC
+ Mu.Schema.Examples: GenderMsgGender7 :: GenderMsg f_ayDC
+ Mu.Schema.Examples: GenderMsgGender8 :: GenderMsg f_ayDC
+ Mu.Schema.Examples: GenderMsgGender9 :: GenderMsg f_ayDC
+ Mu.Schema.Examples: GenderMsgUnspecified :: GenderMsg f_ayDC
+ Mu.Schema.Examples: Unspecified :: Gender
- Mu.Schema.Examples: AddressMsg :: f_ayiR Text -> f_ayiR Text -> AddressMsg f_ayiR
+ Mu.Schema.Examples: AddressMsg :: f_ayDE Text -> f_ayDE Text -> AddressMsg f_ayDE
- Mu.Schema.Examples: GenderMsgFemale :: GenderMsg f_ayiP
+ Mu.Schema.Examples: GenderMsgFemale :: GenderMsg f_ayDC
- Mu.Schema.Examples: GenderMsgMale :: GenderMsg f_ayiP
+ Mu.Schema.Examples: GenderMsgMale :: GenderMsg f_ayDC
- Mu.Schema.Examples: GenderMsgNb :: GenderMsg f_ayiP
+ Mu.Schema.Examples: GenderMsgNb :: GenderMsg f_ayDC
- Mu.Schema.Examples: PersonMsg :: f_ayiT Text -> f_ayiT Text -> f_ayiT (Maybe Int) -> f_ayiT (Maybe (GenderMsg f_ayiT)) -> f_ayiT (AddressMsg f_ayiT) -> f_ayiT [Int] -> PersonMsg f_ayiT
+ Mu.Schema.Examples: PersonMsg :: f_ayDG Text -> f_ayDG Text -> f_ayDG (Maybe Int) -> f_ayDG (Maybe (GenderMsg f_ayDG)) -> f_ayDG (AddressMsg f_ayDG) -> f_ayDG [Int] -> PersonMsg f_ayDG
- Mu.Schema.Examples: [addressMsgCountry] :: AddressMsg f_ayiR -> f_ayiR Text
+ Mu.Schema.Examples: [addressMsgCountry] :: AddressMsg f_ayDE -> f_ayDE Text
- Mu.Schema.Examples: [addressMsgPostcode] :: AddressMsg f_ayiR -> f_ayiR Text
+ Mu.Schema.Examples: [addressMsgPostcode] :: AddressMsg f_ayDE -> f_ayDE Text
- Mu.Schema.Examples: [personMsgAddress] :: PersonMsg f_ayiT -> f_ayiT (AddressMsg f_ayiT)
+ Mu.Schema.Examples: [personMsgAddress] :: PersonMsg f_ayDG -> f_ayDG (AddressMsg f_ayDG)
- Mu.Schema.Examples: [personMsgAge] :: PersonMsg f_ayiT -> f_ayiT (Maybe Int)
+ Mu.Schema.Examples: [personMsgAge] :: PersonMsg f_ayDG -> f_ayDG (Maybe Int)
- Mu.Schema.Examples: [personMsgFirstName] :: PersonMsg f_ayiT -> f_ayiT Text
+ Mu.Schema.Examples: [personMsgFirstName] :: PersonMsg f_ayDG -> f_ayDG Text
- Mu.Schema.Examples: [personMsgGender] :: PersonMsg f_ayiT -> f_ayiT (Maybe (GenderMsg f_ayiT))
+ Mu.Schema.Examples: [personMsgGender] :: PersonMsg f_ayDG -> f_ayDG (Maybe (GenderMsg f_ayDG))
- Mu.Schema.Examples: [personMsgLastName] :: PersonMsg f_ayiT -> f_ayiT Text
+ Mu.Schema.Examples: [personMsgLastName] :: PersonMsg f_ayDG -> f_ayDG Text
- Mu.Schema.Examples: [personMsgLucky_numbers] :: PersonMsg f_ayiT -> f_ayiT [Int]
+ Mu.Schema.Examples: [personMsgLucky_numbers] :: PersonMsg f_ayDG -> f_ayDG [Int]
- Mu.Schema.Examples: data AddressMsg f_ayiR
+ Mu.Schema.Examples: data AddressMsg f_ayDE
- Mu.Schema.Examples: data GenderMsg f_ayiP
+ Mu.Schema.Examples: data GenderMsg f_ayDC
- Mu.Schema.Examples: data PersonMsg f_ayiT
+ Mu.Schema.Examples: data PersonMsg f_ayDG
- Mu.Schema.Examples: type ExampleSchema = '[ 'DEnum "gender" '[ 'ChoiceDef "male", 'ChoiceDef "female", 'ChoiceDef "nb"], 'DRecord "address" '[ 'FieldDef "postcode" ('TPrimitive Text), 'FieldDef "country" ('TPrimitive Text)], 'DRecord "person" '[ 'FieldDef "firstName" ('TPrimitive Text), 'FieldDef "lastName" ('TPrimitive Text), 'FieldDef "age" ('TOption ('TPrimitive Int)), 'FieldDef "gender" ('TOption ('TSchematic "gender")), 'FieldDef "address" ('TSchematic "address"), 'FieldDef "lucky_numbers" ('TList ('TPrimitive Int))]]
+ Mu.Schema.Examples: type ExampleSchema = '[ 'DEnum "gender" '[ 'ChoiceDef "male", 'ChoiceDef "female", 'ChoiceDef "nb", 'ChoiceDef "gender0", 'ChoiceDef "gender1", 'ChoiceDef "gender2", 'ChoiceDef "gender3", 'ChoiceDef "gender4", 'ChoiceDef "gender5", 'ChoiceDef "gender6", 'ChoiceDef "gender7", 'ChoiceDef "gender8", 'ChoiceDef "gender9", 'ChoiceDef "unspecified"], 'DRecord "address" '[ 'FieldDef "postcode" ('TPrimitive Text), 'FieldDef "country" ('TPrimitive Text)], 'DRecord "person" '[ 'FieldDef "firstName" ('TPrimitive Text), 'FieldDef "lastName" ('TPrimitive Text), 'FieldDef "age" ('TOption ('TPrimitive Int)), 'FieldDef "gender" ('TOption ('TSchematic "gender")), 'FieldDef "address" ('TSchematic "address"), 'FieldDef "lucky_numbers" ('TList ('TPrimitive Int))]]
- Mu.Schema.Examples: type GenderFieldMapping = '["Male" :-> "male", "Female" :-> "female", "NonBinary" :-> "nb"]
+ Mu.Schema.Examples: type GenderFieldMapping = '["Male" :-> "male", "Female" :-> "female", "NonBinary" :-> "nb", "Gender0" :-> "gender0", "Gender1" :-> "gender1", "Gender2" :-> "gender2", "Gender3" :-> "gender3", "Gender4" :-> "gender4", "Gender5" :-> "gender5", "Gender6" :-> "gender6", "Gender7" :-> "gender7", "Gender8" :-> "gender8", "Gender9" :-> "gender9", "Unspecified" :-> "unspecified"]
Files
- mu-schema.cabal +2/−1
- src/Mu/Schema/Class.hs +45/−42
- src/Mu/Schema/Examples.hs +41/−5
mu-schema.cabal view
@@ -1,5 +1,5 @@ name: mu-schema-version: 0.3.1.0+version: 0.3.1.1 synopsis: Format-independent schemas for serialization description: With @mu-schema@ you can describe schemas using type-level constructs, and derive serializers from those. See @mu-avro@, @mu-protobuf@ for the actual adapters.@@ -42,6 +42,7 @@ , base >=4.12 && <5 , bytestring >=0.10 && <0.11 , containers >=0.6 && <0.7+ , first-class-families >=0.8 && <0.9 , sop-core >=0.5 && <0.6 , template-haskell >=2.14 && <2.16 , text >=1.2 && <2
src/Mu/Schema/Class.hs view
@@ -53,6 +53,8 @@ import GHC.Generics import GHC.TypeLits +import Fcf (Eval, Exp, Pure)+import Fcf.Data.List (Snoc) import Mu.Schema.Definition import Mu.Schema.Interpretation @@ -183,29 +185,42 @@ -- Note: it turns out that GHC.Generics generates some weird -- instances for records in the form (x :*: y) :*: z -- and we cover them with the special HereLeft and HereRight-data Where = Here | HereLeft | HereRight | HereRightThenLeft | HereTwoRights | There Where+data Where = Here | There Where+data WhereStep = StepNoMore | StepLeft | StepRight type family Find (xs :: [k]) (x :: k) :: Where where Find '[] y = TypeError ('Text "Could not find " ':<>: 'ShowType y) Find (y ': xs) y = 'Here Find (x ': xs) y = 'There (Find xs y) -type family FindCon (xs :: * -> *) (x :: Symbol) :: Where where- FindCon (C1 ('MetaCons x p s) f) x = 'Here- FindCon (C1 ('MetaCons x p s) f :+: rest) x = 'Here- FindCon (other :+: rest) x = 'There (FindCon rest x)- FindCon nothing x = TypeError ('Text "Could not find constructor " ':<>: 'ShowType x)+type family FindCon (xs :: * -> *) (x :: Symbol) :: [WhereStep] where+ FindCon xs x = WhenEmpty+ (FindCon' '[] xs x)+ (TypeError ('Text "Could not find constructor " ':<>: 'ShowType x)) -type family FindSel (xs :: * -> *) (x :: Symbol) :: Where where- FindSel (S1 ('MetaSel ('Just x) u ss ds) f) x = 'Here- FindSel (S1 ('MetaSel ('Just x) u ss ds) f :*: rest) x = 'Here- FindSel ((S1 ('MetaSel ('Just x) u ss ds) f :*: other) :*: rest) x = 'HereLeft- FindSel ((other :*: S1 ('MetaSel ('Just x) u ss ds) f) :*: rest) x = 'HereRight- FindSel ((other1 :*: (S1 ('MetaSel ('Just x) u ss ds) f :*: other2)) :*: rest) x = 'HereRightThenLeft- FindSel ((other1 :*: (other2 :*: S1 ('MetaSel ('Just x) u ss ds) f)) :*: rest) x = 'HereTwoRights- FindSel (other :*: rest) x = 'There (FindSel rest x)- FindSel nothing x = TypeError ('Text "Could not find selector " ':<>: 'ShowType x)+type family FindCon' (begin :: [WhereStep]) (xs :: * -> *) (x :: Symbol) :: [WhereStep] where+ FindCon' acc (C1 ('MetaCons x p s) f) x = Eval (Snoc acc 'StepNoMore)+ FindCon' acc (left :+: right) x = WhenEmpty+ (FindCon' (Eval (Snoc acc 'StepLeft)) left x)+ (Pure (FindCon' (Eval (Snoc acc 'StepRight)) right x))+ FindCon' acc other x = '[] +type family WhenEmpty (left :: [a]) (right :: Exp [a]) :: [a] where+ WhenEmpty '[] b = Eval b+ WhenEmpty a _ = a++type family FindSel (xs :: * -> *) (x :: Symbol) :: [WhereStep] where+ FindSel xs x = WhenEmpty+ (FindSel' '[] xs x)+ (TypeError ('Text "Could not find field " ':<>: 'ShowType x))++type family FindSel' (begin :: [WhereStep]) (xs :: * -> *) (x :: Symbol) :: [WhereStep] where+ FindSel' acc (S1 ('MetaSel ('Just x) u ss ds) f) x = Eval (Snoc acc 'StepNoMore)+ FindSel' acc (left :*: right) x = WhenEmpty+ (FindSel' (Eval (Snoc acc 'StepLeft)) left x)+ (Pure (FindSel' (Eval (Snoc acc 'StepRight)) right x))+ FindSel' acc other x = '[]+ type family FindEnumChoice (xs :: [ChoiceDef fs]) (x :: fs) :: Where where FindEnumChoice '[] x = TypeError ('Text "Could not find enum choice " ':<>: 'ShowType x) FindEnumChoice ('ChoiceDef name ': xs) name = 'Here@@ -473,15 +488,14 @@ fromSchemaEnumDecomp _ (Z _) = fromSchemaEnumU1 (Proxy @f) (Proxy @(FindCon f (MappingLeft fmap c))) fromSchemaEnumDecomp p (S x) = fromSchemaEnumDecomp p x -class GFromSchemaEnumU1 (f :: * -> *) (w :: Where) where+class GFromSchemaEnumU1 (f :: * -> *) (w :: [WhereStep]) where fromSchemaEnumU1 :: Proxy f -> Proxy w -> f a-instance GFromSchemaEnumU1 (C1 m U1 :+: rest) 'Here where- fromSchemaEnumU1 _ _ = L1 (M1 U1)-instance GFromSchemaEnumU1 (C1 m U1) 'Here where+instance GFromSchemaEnumU1 (C1 m U1) '[ 'StepNoMore ] where fromSchemaEnumU1 _ _ = M1 U1-instance forall other rest w. GFromSchemaEnumU1 rest w- => GFromSchemaEnumU1 (other :+: rest) ('There w) where- fromSchemaEnumU1 _ _ = R1 (fromSchemaEnumU1 (Proxy @rest) (Proxy @w))+instance GFromSchemaEnumU1 left rest => GFromSchemaEnumU1 (left :+: right) ('StepLeft ': rest) where+ fromSchemaEnumU1 _ _ = L1 (fromSchemaEnumU1 (Proxy @left) (Proxy @rest))+instance GFromSchemaEnumU1 right rest => GFromSchemaEnumU1 (left :+: right) ('StepRight ': rest) where+ fromSchemaEnumU1 _ _ = R1 (fromSchemaEnumU1 (Proxy @right) (Proxy @rest)) -- ---------- -- RECORDS --@@ -541,29 +555,18 @@ where this = Field (toSchemaRecordSearch (Proxy @(FindSel f (MappingLeft fmap name))) x) class GToSchemaRecordSearch (sch :: Schema ts fs)- (t :: FieldType ts) (f :: * -> *) (wh :: Where) where+ (t :: FieldType ts) (f :: * -> *) (wh :: [WhereStep]) where toSchemaRecordSearch :: Proxy wh -> f a -> FieldValue sch t instance GToSchemaFieldType sch t v- => GToSchemaRecordSearch sch t (S1 m (K1 i v)) 'Here where+ => GToSchemaRecordSearch sch t (S1 m (K1 i v)) '[ 'StepNoMore ] where toSchemaRecordSearch _ (M1 (K1 x)) = toSchemaFieldType x-instance GToSchemaFieldType sch t v- => GToSchemaRecordSearch sch t (S1 m (K1 i v) :*: rest) 'Here where- toSchemaRecordSearch _ (M1 (K1 x) :*: _) = toSchemaFieldType x-instance GToSchemaFieldType sch t v- => GToSchemaRecordSearch sch t ((S1 m (K1 i v) :*: other) :*: rest) 'HereLeft where- toSchemaRecordSearch _ ((M1 (K1 x) :*: _) :*: _) = toSchemaFieldType x-instance GToSchemaFieldType sch t v- => GToSchemaRecordSearch sch t ((other :*: S1 m (K1 i v)) :*: rest) 'HereRight where- toSchemaRecordSearch _ ((_ :*: M1 (K1 x)) :*: _) = toSchemaFieldType x-instance GToSchemaFieldType sch t v- => GToSchemaRecordSearch sch t ((other1 :*: (S1 m (K1 i v) :*: other2)) :*: rest) 'HereRightThenLeft where- toSchemaRecordSearch _ ((_ :*: (M1 (K1 x) :*: _)) :*: _) = toSchemaFieldType x-instance GToSchemaFieldType sch t v- => GToSchemaRecordSearch sch t ((other1 :*: (other2 :*: S1 m (K1 i v))) :*: rest) 'HereTwoRights where- toSchemaRecordSearch _ ((_ :*: (_ :*: M1 (K1 x))) :*: _) = toSchemaFieldType x-instance forall sch t other rest n.- GToSchemaRecordSearch sch t rest n- => GToSchemaRecordSearch sch t (other :*: rest) ('There n) where+instance forall sch t left right n.+ GToSchemaRecordSearch sch t left n+ => GToSchemaRecordSearch sch t (left :*: right) ('StepLeft ': n) where+ toSchemaRecordSearch _ (xs :*: _) = toSchemaRecordSearch (Proxy @n) xs+instance forall sch t left right n.+ GToSchemaRecordSearch sch t right n+ => GToSchemaRecordSearch sch t (left :*: right) ('StepRight ': n) where toSchemaRecordSearch _ (_ :*: xs) = toSchemaRecordSearch (Proxy @n) xs -- 'fromSchema' for records
src/Mu/Schema/Examples.hs view
@@ -49,11 +49,36 @@ via (WithSchema ExampleSchema "address" Address) type GenderFieldMapping- = '[ "Male" ':-> "male"- , "Female" ':-> "female"- , "NonBinary" ':-> "nb" ]+ = '[ "Male" ':-> "male"+ , "Female" ':-> "female"+ , "NonBinary" ':-> "nb"+ , "Gender0" ':-> "gender0"+ , "Gender1" ':-> "gender1"+ , "Gender2" ':-> "gender2"+ , "Gender3" ':-> "gender3"+ , "Gender4" ':-> "gender4"+ , "Gender5" ':-> "gender5"+ , "Gender6" ':-> "gender6"+ , "Gender7" ':-> "gender7"+ , "Gender8" ':-> "gender8"+ , "Gender9" ':-> "gender9"+ , "Unspecified" ':-> "unspecified"] -data Gender = Male | Female | NonBinary+data Gender+ = Male+ | Female+ | NonBinary+ | Gender0+ | Gender1+ | Gender2+ | Gender3+ | Gender4+ | Gender5+ | Gender6+ | Gender7+ | Gender8+ | Gender9+ | Unspecified deriving (Eq, Show, Generic) deriving (ToSchema ExampleSchema "gender", FromSchema ExampleSchema "gender") via (CustomFieldMapping "gender" GenderFieldMapping Gender)@@ -65,7 +90,18 @@ = '[ 'DEnum "gender" '[ 'ChoiceDef "male" , 'ChoiceDef "female"- , 'ChoiceDef "nb" ]+ , 'ChoiceDef "nb"+ , 'ChoiceDef "gender0"+ , 'ChoiceDef "gender1"+ , 'ChoiceDef "gender2"+ , 'ChoiceDef "gender3"+ , 'ChoiceDef "gender4"+ , 'ChoiceDef "gender5"+ , 'ChoiceDef "gender6"+ , 'ChoiceDef "gender7"+ , 'ChoiceDef "gender8"+ , 'ChoiceDef "gender9"+ , 'ChoiceDef "unspecified" ] , 'DRecord "address" '[ 'FieldDef "postcode" ('TPrimitive T.Text) , 'FieldDef "country" ('TPrimitive T.Text) ]