----------------------------------------------------------------------------
-- |
-- Module      :  Data.Traversable.Constrained.Instances
-- Copyright   :  (c) Sergey Vinokurov 2019
-- License     :  BSD-2 (see LICENSE)
-- Maintainer  :  sergey@debian
----------------------------------------------------------------------------

{-# LANGUAGE ConstraintKinds       #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies          #-}

{-# OPTIONS_GHC -Wno-orphans #-}

module Data.Traversable.Constrained.Instances () where

import qualified Data.Array as A
import Data.IntMap (IntMap)
import Data.Map (Map)
import Data.Set (Set)
import qualified Data.Set as S

import qualified Data.Vector as V
import qualified Data.Vector.Primitive as VP
import qualified Data.Vector.Storable as VS
import qualified Data.Vector.Unboxed as VU

import Data.Constrained.Instances ()
import Data.Foldable.Constrained.Instances ()
import Data.Functor.Constrained.Instances ()
import Data.Traversable.Constrained

instance A.Ix i => CTraversable (A.Array i) where
  {-# INLINE csequence #-}
  csequence = sequenceA

instance CTraversable IntMap where
  {-# INLINE csequence #-}
  csequence = sequenceA

instance CTraversable (Map k) where
  {-# INLINE csequence #-}
  csequence = sequenceA

instance CTraversable Set where
  ctraverse f = S.foldr (\x rest -> S.insert <$> f x <*> rest) (pure S.empty)

instance CTraversable V.Vector where
  {-# INLINE csequence #-}
  csequence = sequenceA

instance CTraversable VP.Vector where
  {-# INLINE ctraverse #-}
  ctraverse = VP.mapM

instance CTraversable VS.Vector where
  {-# INLINE ctraverse #-}
  ctraverse = VS.mapM

instance CTraversable VU.Vector where
  {-# INLINE ctraverse #-}
  ctraverse = VU.mapM