{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
-- |
-- Module:       $HEADER$
-- Description:  Default instances for types defined in vector package.
-- Copyright:    (c) 2015-2016, Peter Trško
-- License:      BSD3
--
-- Maintainer:   peter.trsko@gmail.com
-- Stability:    stable
-- Portability:  NoImplicitPrelude
--
-- 'Default' instances for types
-- <https://hackage.haskell.org/package/vector vector> package.
module Data.Default.Instances.Vector
    ( -- $providedInstances
    )
  where

import Data.Vector (Vector, empty)
import Data.Vector.Unboxed (Unbox)
import qualified Data.Vector.Unboxed as Unboxed (Vector, empty)
import Data.Vector.Storable (Storable)
import qualified Data.Vector.Storable as Storable (Vector, empty)

import Data.Default.Class (Default(def))


-- All "empty" functions we import from Vector are actually implemented using
-- the same generic function, but using it like this provides us with more
-- robust code.

instance Default (Vector a) where
    def = empty
    {-# INLINE def #-}
    -- Function empty is also inlined and we need to preserve low-level
    -- optimizations that are done in vector package.

instance Storable a => Default (Storable.Vector a) where
    def = Storable.empty
    {-# INLINE def #-}
    -- Function Storable.empty is also inlined and we need to preserve
    -- low-level optimizations that are done in vector package.

instance Unbox a => Default (Unboxed.Vector a) where
    def = Unboxed.empty
    {-# INLINE def #-}
    -- Function Unboxed.empty is also inlined and we need to preserve low-level
    -- optimizations that are done in vector package.

-- $providedInstances
--
-- @
-- instance 'Default' ('Vector' a) where
--     'def' = 'empty'
--
-- instance 'Storable' a => 'Default' ('Storable.Vector' a) where
--     'def' = 'Storable.empty'
--
-- instance 'Unbox' a => 'Default' ('Unboxed.Vector' a) where
--     'def' = 'Unboxed.empty'
-- @