{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies          #-}

module HaskellWorks.Data.Concat
  ( Concat(..)
  ) where

import qualified Data.ByteString               as BS
import           Data.Int
import qualified Data.List                     as L
import qualified Data.Vector                   as DV
import qualified Data.Vector.Storable          as DVS
import           Data.Word

-- | Class of values that support vector like operations
class Concat v where
  concat :: [v] -> v

instance Concat [a] where
  concat = L.concat
  {-# INLINE concat #-}

instance Concat BS.ByteString where
  concat = BS.concat
  {-# INLINE concat #-}

instance Concat (DV.Vector Word8) where
  concat = DV.concat
  {-# INLINE concat #-}

instance Concat (DV.Vector Word16) where
  concat = DV.concat
  {-# INLINE concat #-}

instance Concat (DV.Vector Word32) where
  concat = DV.concat
  {-# INLINE concat #-}

instance Concat (DV.Vector Word64) where
  concat = DV.concat
  {-# INLINE concat #-}

instance Concat (DVS.Vector Word8) where
  concat = DVS.concat
  {-# INLINE concat #-}

instance Concat (DVS.Vector Word16) where
  concat = DVS.concat
  {-# INLINE concat #-}

instance Concat (DVS.Vector Word32) where
  concat = DVS.concat
  {-# INLINE concat #-}

instance Concat (DVS.Vector Word64) where
  concat = DVS.concat
  {-# INLINE concat #-}

instance Concat (DV.Vector Int8) where
  concat = DV.concat
  {-# INLINE concat #-}

instance Concat (DV.Vector Int16) where
  concat = DV.concat
  {-# INLINE concat #-}

instance Concat (DV.Vector Int32) where
  concat = DV.concat
  {-# INLINE concat #-}

instance Concat (DV.Vector Int64) where
  concat = DV.concat
  {-# INLINE concat #-}

instance Concat (DVS.Vector Int8) where
  concat = DVS.concat
  {-# INLINE concat #-}

instance Concat (DVS.Vector Int16) where
  concat = DVS.concat
  {-# INLINE concat #-}

instance Concat (DVS.Vector Int32) where
  concat = DVS.concat
  {-# INLINE concat #-}

instance Concat (DVS.Vector Int64) where
  concat = DVS.concat
  {-# INLINE concat #-}

instance Concat (DVS.Vector Int) where
  concat = DVS.concat
  {-# INLINE concat #-}