{-# OPTIONS_GHC -Wno-orphans #-}

module Data.Vector.Orphans () where

import Data.Hashable (Hashable (hashWithSalt))
import Data.Vector.Strict qualified as Strict
import Flat (Flat (..))
import Flat.Instances.Vector ()

instance (Hashable a) => Hashable (Strict.Vector a) where
  hashWithSalt :: Int -> Vector a -> Int
hashWithSalt = (Int -> a -> Int) -> Int -> Vector a -> Int
forall a b. (a -> b -> a) -> a -> Vector b -> a
Strict.foldl' Int -> a -> Int
forall a. Hashable a => Int -> a -> Int
hashWithSalt

instance (Flat a) => Flat (Strict.Vector a) where
  size :: Vector a -> Int -> Int
size = Vector a -> Int -> Int
forall a. Flat a => a -> Int -> Int
size (Vector a -> Int -> Int)
-> (Vector a -> Vector a) -> Vector a -> Int -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector a -> Vector a
forall a. Vector a -> Vector a
Strict.toLazy -- Strict to Lazy is O(1)
  encode :: Vector a -> Encoding
encode = Vector a -> Encoding
forall a. Flat a => a -> Encoding
encode (Vector a -> Encoding)
-> (Vector a -> Vector a) -> Vector a -> Encoding
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector a -> Vector a
forall a. Vector a -> Vector a
Strict.toLazy
  decode :: Get (Vector a)
decode = Vector a -> Vector a
forall a. Vector a -> Vector a
Strict.fromLazy (Vector a -> Vector a) -> Get (Vector a) -> Get (Vector a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get (Vector a)
forall a. Flat a => Get a
decode -- Strict from Lazy is O(1)