{-# 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'