-- | -- Module: Optics.Each -- Description: An 'IxTraversal' for 'each' element of a (potentially monomorphic) container. -- -- This module defines the 'Each' class, which provides an 'IxTraversal' that -- extracts 'each' element of a (potentially monomorphic) container. -- {-# LANGUAGE UndecidableInstances #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Optics.Each ( -- * Each Each(..) ) where import qualified Data.ByteString as SB import qualified Data.ByteString.Lazy as LB import Data.HashMap.Lazy (HashMap) import qualified Data.HashMap.Lazy as HashMap import Data.Int (Int64) import qualified Data.Text as ST import qualified Data.Text.Lazy as LT import Data.Text.Optics (text) import Data.Vector.Generic.Optics (vectorTraverse) import Data.Vector.Primitive (Prim) import Data.Vector.Storable (Storable) import Data.Vector.Unboxed (Unbox) import Data.Word (Word8) 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 Optics.Core import Optics.Indexed () import Optics.Extra.Internal.ByteString -- Extra instances -- | @'each' :: 'IxTraversal' k ('HashMap' k a) ('HashMap' k b) a b@ instance k ~ k' => Each k (HashMap k a) (HashMap k' b) a b where -- traverseWithKey has best performance for all flavours for some reason. each = itraversalVL HashMap.traverseWithKey {-# INLINE[1] each #-} -- | @'each' :: 'IxTraversal' Int ('V.Vector' a) ('V.Vector' b) a b@ instance Each Int (V.Vector a) (V.Vector b) a b where each = vectorTraverse {-# INLINE[1] each #-} -- | @'each' :: ('Prim' a, 'Prim' b) => 'IxTraversal' Int ('Prim.Vector' a) -- ('Prim.Vector' b) a b@ instance (Prim a, Prim b) => Each Int (VP.Vector a) (VP.Vector b) a b where each = vectorTraverse {-# INLINE[1] each #-} -- | @'each' :: ('Storable' a, 'Storable' b) => 'IxTraversal' 'Int' ('VS.Vector' -- a) ('VS.Vector' b) a b@ instance (Storable a, Storable b) => Each Int (VS.Vector a) (VS.Vector b) a b where each = vectorTraverse {-# INLINE[1] each #-} -- | @'each' :: ('Unbox' a, 'Unbox' b) => 'IxTraversal' 'Int' ('VU.Vector' a) -- ('VU.Vector' b) a b@ instance (Unbox a, Unbox b ) => Each Int (VU.Vector a) (VU.Vector b) a b where each = vectorTraverse {-# INLINE[1] each #-} -- | @'each' :: 'IxTraversal' 'Int' 'ST.Text' 'ST.Text' 'Char' 'Char'@ instance (a ~ Char, b ~ Char) => Each Int ST.Text ST.Text a b where each = text {-# INLINE[1] each #-} -- | @'each' :: 'IxTraversal' 'Int64' 'LT.Text' 'LT.Text' 'Char' 'Char'@ instance (a ~ Char, b ~ Char) => Each Int LT.Text LT.Text a b where each = text {-# INLINE[1] each #-} -- | @'each' :: 'IxTraversal' 'Int' 'SB.ByteString' 'SB.ByteString' 'Word8' -- 'Word8'@ instance (a ~ Word8, b ~ Word8) => Each Int64 SB.ByteString SB.ByteString a b where each = traversedStrictTree {-# INLINE[1] each #-} -- | @'each' :: 'IxTraversal' 'Int64' 'LB.ByteString' 'LB.ByteString' 'Word8' -- 'Word8'@ instance (a ~ Word8, b ~ Word8) => Each Int64 LB.ByteString LB.ByteString a b where each = traversedLazy {-# INLINE[1] each #-}