@@ -10,6 +10,7 @@ import Data.Aeson.Types
1010import Data.Coerce
1111import Data.Foldable
1212import Data.Functor.Identity
13+import Data.Kind
1314import Data.Monoid
1415import Data.Schematic.Path
1516import Data.Schematic.Schema
@@ -241,8 +242,21 @@ instance SingI (SchemaObject s) => Validatable (SchemaObject s) where
241242 $ lookaheadJsonRepr newPath d
242243 go ftl
243244
244−instance SingI (SchemaUnion s) => Validatable (SchemaUnion s) where
245− validateJsonRepr dpath (ReprUnion u) = pure ()
245+instance
246+ (SingI (SchemaUnion (s ': tl)))
247+ => Validatable (SchemaUnion (s ': tl)) where
248+ validateJsonRepr dpath (ReprUnion u) = do
249+ let
250+ v :: forall s. Sing s -> JsonRepr s -> Const (Validation ()) s
251+ v s j = withSingI s $ Const $ lookaheadJsonRepr dpath j
252+ peel :: Union (Const (Validation ())) ts -> Validation ()
253+ peel (That u) = peel u
254+ peel (This v) = getConst v
255+ umap' :: (forall a . Sing a -> f a -> g a) -> SList as -> Union f as -> Union g as
256+ umap' f (SCons s' stl') = \case
257+ This a -> This (f s' a)
258+ That u -> That (umap' f stl' u)
259+ peel (umap' v sing u)
246260
247261 -- ReprUnion u -> do
248262 -- let