{-# OPTIONS_GHC -fno-warn-orphans #-} module Data.Aeson.Extra.SizedVector() where import Data.Aeson import Data.Vector.Generic.Sized.Internal qualified as VSI import Data.Vector.Generic.Sized qualified as VS import Data.Vector.Generic qualified as V import GHC.TypeNats ( KnownNat ) instance ToJSON (v a) => ToJSON (VSI.Vector v n a) where toJSON :: Vector v n a -> Value toJSON (VSI.Vector v a v) = v a -> Value forall a. ToJSON a => a -> Value toJSON v a v toEncoding :: Vector v n a -> Encoding toEncoding (VSI.Vector v a v) = v a -> Encoding forall a. ToJSON a => a -> Encoding toEncoding v a v instance (FromJSON (v a), KnownNat n, V.Vector v a) => FromJSON (VSI.Vector v n a) where parseJSON :: Value -> Parser (Vector v n a) parseJSON Value j = do v a v <- Value -> Parser (v a) forall a. FromJSON a => Value -> Parser a parseJSON Value j case v a -> Maybe (Vector v n a) forall (v :: Type -> Type) (n :: Nat) a. (Vector v a, KnownNat n) => v a -> Maybe (Vector v n a) VS.toSized v a v of Maybe (Vector v n a) Nothing -> String -> Parser (Vector v n a) forall a. String -> Parser a forall (m :: Type -> Type) a. MonadFail m => String -> m a fail String "TODO bad size" Just Vector v n a v' -> Vector v n a -> Parser (Vector v n a) forall a. a -> Parser a forall (f :: Type -> Type) a. Applicative f => a -> f a pure Vector v n a v'