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

module HaskellWorks.Data.Take
    ( Container(..)
    , Take(..)
    ) where

import Data.Int
import Data.Word
import HaskellWorks.Data.Container
import HaskellWorks.Data.Positioning

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

class Container v => Take v where
  take :: Count -> v -> v

instance Take [a] where
  take = L.take . fromIntegral
  {-# INLINE take #-}

instance Take BS.ByteString where
  take = BS.take . fromIntegral
  {-# INLINE take #-}

instance Take (DV.Vector Word8) where
  take = DV.take . fromIntegral
  {-# INLINE take #-}

instance Take (DV.Vector Word16) where
  take = DV.take . fromIntegral
  {-# INLINE take #-}

instance Take (DV.Vector Word32) where
  take = DV.take . fromIntegral
  {-# INLINE take #-}

instance Take (DV.Vector Word64) where
  take = DV.take . fromIntegral
  {-# INLINE take #-}

instance Take (DVS.Vector Word8) where
  take = DVS.take . fromIntegral
  {-# INLINE take #-}

instance Take (DVS.Vector Word16) where
  take = DVS.take . fromIntegral
  {-# INLINE take #-}

instance Take (DVS.Vector Word32) where
  take = DVS.take . fromIntegral
  {-# INLINE take #-}

instance Take (DVS.Vector Word64) where
  take = DVS.take . fromIntegral
  {-# INLINE take #-}

instance Take (DV.Vector Int8) where
  take = DV.take . fromIntegral
  {-# INLINE take #-}

instance Take (DV.Vector Int16) where
  take = DV.take . fromIntegral
  {-# INLINE take #-}

instance Take (DV.Vector Int32) where
  take = DV.take . fromIntegral
  {-# INLINE take #-}

instance Take (DV.Vector Int64) where
  take = DV.take . fromIntegral
  {-# INLINE take #-}

instance Take (DVS.Vector Int8) where
  take = DVS.take . fromIntegral
  {-# INLINE take #-}

instance Take (DVS.Vector Int16) where
  take = DVS.take . fromIntegral
  {-# INLINE take #-}

instance Take (DVS.Vector Int32) where
  take = DVS.take . fromIntegral
  {-# INLINE take #-}

instance Take (DVS.Vector Int64) where
  take = DVS.take . fromIntegral
  {-# INLINE take #-}

instance Take (DVS.Vector Int) where
  take = DVS.take . fromIntegral
  {-# INLINE take #-}