-- | Sized vectors.

{-# LANGUAGE NoStarIsType #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module Binrep.Type.Vector where

import Binrep
import Data.Vector.Sized qualified as V
import Data.Vector.Sized ( Vector )
import GHC.TypeNats

instance BLen a => BLen (Vector n a) where
    type CBLen (Vector n a) = CBLen a * n
    blen :: Vector n a -> BLenT
blen = forall a (n :: Nat). Num a => Vector n a -> a
V.sum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b (n :: Nat). (a -> b) -> Vector n a -> Vector n b
V.map forall a. BLen a => a -> BLenT
blen

instance Put a => Put (Vector n a) where
    put :: Vector n a -> Builder
put = forall a. Monoid a => [a] -> a
mconcat forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) a. Vector n a -> [a]
V.toList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b (n :: Nat). (a -> b) -> Vector n a -> Vector n b
V.map forall a. Put a => a -> Builder
put

instance (Get a, KnownNat n) => Get (Vector n a) where
    get :: Getter (Vector n a)
get = forall (n :: Nat) a. KnownNat n => Getter a -> Getter (Vector n a)
getVector forall a. Get a => Getter a
get

getVector :: KnownNat n => Getter a -> Getter (Vector n a)
getVector :: forall (n :: Nat) a. KnownNat n => Getter a -> Getter (Vector n a)
getVector Getter a
g = forall (n :: Nat) (m :: Type -> Type) a.
(KnownNat n, Monad m) =>
m a -> m (Vector n a)
V.replicateM Getter a
g