-----------------------------------------------------------------------------
-- | Module     :  Data.Aligned.Key
--
-- 'These'-based zipping and unzipping of indexed functors.
module Data.Align.Key (
    AlignWithKey (..)
    ) where

import Data.Key (Key, Keyed (..))
import Data.Vector.Instances ()

import Data.Align
import Data.These

-- Instances
--import Control.Applicative  (ZipList)
import Data.Hashable        (Hashable)
import Data.HashMap.Strict  (HashMap)
import Data.IntMap          (IntMap)
import Data.Map             (Map)
import Data.Sequence        (Seq)
import Data.Vector          (Vector)

-- | Keyed version of 'Align'.
class (Keyed f, Align f) => AlignWithKey f where
    -- | Analogous to @'alignWith'@, but also provides an index.
    alignWithKey :: (Key f -> These a b -> c) -> f a -> f b -> f c
    alignWithKey f a b = mapWithKey f (align a b)

instance AlignWithKey Maybe
instance AlignWithKey []
--instance AlignWithKey ZipList
instance AlignWithKey Seq
instance AlignWithKey IntMap
instance Ord k => AlignWithKey (Map k)
instance (Eq k, Hashable k) => AlignWithKey (HashMap k)
instance AlignWithKey Vector