these-0.7.6: Data/Align/Indexed.hs
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
-----------------------------------------------------------------------------
-- | Module : Data.Align.Indexed
--
-- 'These'-based zipping and unzipping of indexed functors.
--
-- @since 0.7.6
module Data.Align.Indexed (
AlignWithIndex (..),
) where
import Control.Lens (FunctorWithIndex)
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)
import qualified Data.Align.Key as Key
-- | Keyed version of 'Align'.
--
-- @since 0.7.6
class (FunctorWithIndex i f, Align f) => AlignWithIndex i f | f -> i where
-- | Analogous to @'alignWith'@, but also provides an index.
ialign :: (i -> These a b -> c) -> f a -> f b -> f c
instance AlignWithIndex () Maybe where ialign = Key.alignWithKey
instance AlignWithIndex Int [] where ialign = Key.alignWithKey
instance AlignWithIndex Int ZipList where ialign = Key.alignWithKey
instance AlignWithIndex Int Seq where ialign = Key.alignWithKey
instance AlignWithIndex Int IntMap where ialign = Key.alignWithKey
instance Ord k => AlignWithIndex k (Map k) where ialign = Key.alignWithKey
instance (Eq k, Hashable k) => AlignWithIndex k (HashMap k) where ialign = Key.alignWithKey
instance AlignWithIndex Int Vector where ialign = Key.alignWithKey