@@ -15,6 +15,13 @@ import GHC.Generics
1515import GHC.TypeLits (KnownNat, natVal, KnownSymbol, symbolVal, Symbol, Nat)
1616
1717
18+type family JT (s :: k) :: JType where
19+ JT (SNumber cs) = 'JNumber
20+ JT (SText cs) = 'JText
21+ JT (SObject els) = 'JObject
22+ JT (SArray cs s) = 'JArray
23+ JT (Field field ty cs) = JT ty
24+
1825class Constrained (ty :: JType) c where
1926 cRep :: Proxy ty -> Proxy c -> CRepr ty
2027
@@ -90,40 +97,33 @@ instance SchemaConstructor 'JObject where
9097 constructor _ = Fix . SchemaObject
9198
9299class Schematic ty where
93− type JT (ty :: k) :: JType
94100 build :: Proxy ty -> Schema
95101
96102data SText cs
97103
98104instance (Verifiable 'JText cs) => Schematic (SText cs) where
99− type JT (SText cs) = 'JText
100105 build _ = constructor (Proxy @(JT (SText cs))) $ schema (Proxy @JText) (Proxy @cs)
101106
102107data SNumber cs
103108
104109instance (Verifiable 'JNumber cs) => Schematic (SNumber cs) where
105− type JT (SNumber cs) = 'JNumber
106110 build _ = constructor (Proxy @(JT (SNumber cs)))
107111 $ schema (Proxy @'JNumber) (Proxy @cs)
108112
109113instance
110114 ( Verifiable (JT ty) cs
111− , SchemaConstructor (JT ty) )
115+ , SchemaConstructor (JT ty))
112116 => Schematic (Field field ty cs) where
113− type JT (Field field ty cs) = JT ty
114117 build _ = constructor (Proxy @(JT (Field field ty cs)))
115118 $ schema (Proxy @(JT (Field field ty cs))) (Proxy @cs)
116119
117−data SObject typeName els
120+data SObject els
118121
119122instance
120− ( Verifiable 'JObject els
121− , KnownSymbol typeName )
122− => Schematic (SObject typeName els) where
123− type JT (SObject typeName els) = 'JObject
123+ ( Verifiable 'JObject els )
124+ => Schematic (SObject els) where
124125 build _ =
125− constructor (Proxy @(JT (SObject typeName els)))
126− $ schema (Proxy @(JT (SObject typeName els))) (Proxy @els)
126+ constructor (Proxy @'JObject) $ schema (Proxy @(JT (SObject els))) (Proxy @els)
127127
128128data SArray cs s
129129
@@ -131,22 +131,21 @@ instance
131131 ( Schematic s
132132 , Verifiable 'JArray cs )
133133 => Schematic (SArray cs s) where
134− type JT (SArray cs s) = 'JArray
135134 build _ =
136135 Fix $ SchemaArray
137136 (schema (Proxy @'JArray) (Proxy @cs))
138137 (build (Proxy @s))
139138
140139-- | Shows it's top-level definition according to the json-schema
141−class TopLevel spec
140+class Schematic spec => TopLevel spec
142141
143−instance Schematic (SObject els) => TopLevel (SObject els)
142+instance (Schematic (SObject els)) => TopLevel (SObject els)
144143
145144instance Schematic (SArray cs s) => TopLevel (SArray cs s)
146145
147146-- | TODO: abstract over objects and arrays
148−-- toSchema
149−-- :: forall els (e :: [k]). (e ~ '[], Verifiable (JT (SObject els)) e, Schematic (SObject els))
150−-- => Proxy (SObject els)
151−-- -> Schema
152−-- toSchema p = constructor p $ schema (Proxy @(JT (SObject els))) (Proxy @els)
147+toSchema
148+ :: forall spec. TopLevel spec
149+ => Proxy spec
150+ -> Schema
151+toSchema = build