{-# LANGUAGE DerivingStrategies #-}{-# LANGUAGE GeneralizedNewtypeDeriving #-}{-# LANGUAGE NoImplicitPrelude #-}{-# LANGUAGE Trustworthy #-}------------------------------------------------------------------------------- |-- Module : Data.Bits-- Copyright : (c) The University of Glasgow 2001-- License : BSD-style (see the file libraries/base/LICENSE)---- Maintainer : libraries@haskell.org-- Stability : stable-- Portability : portable---- This module defines bitwise operations for signed and unsigned-- integers. Instances of the class 'Bits' for the 'Int' and-- 'Integer' types are available from this module, and instances for-- explicitly sized integral types are available from the-- "Data.Int" and "Data.Word" modules.-------------------------------------------------------------------------------moduleData.Bits(-- * Type classesBits ((.&.) ,(.|.) ,xor ,complement ,shift ,rotate ,zeroBits ,bit ,setBit ,clearBit ,complementBit ,testBit ,bitSizeMaybe ,bitSize ,isSigned ,shiftL ,shiftR ,unsafeShiftL ,unsafeShiftR ,rotateL ,rotateR ,popCount ),FiniteBits (finiteBitSize ,countLeadingZeros ,countTrailingZeros ),-- * Extra functionsbitDefault ,testBitDefault ,popCountDefault ,toIntegralSized ,oneBits ,(.^.) ,(.>>.) ,(.<<.) ,(!>>.) ,(!<<.) ,-- * NewtypesAnd (..),Ior (..),Xor (..),Iff (..))whereimportGHC.Base importGHC.Bits importGHC.Enum importqualifiedGHC.List asListimportGHC.Read importGHC.Show -- $setup-- >>> import Prelude-- >>> import Data.Word-- | A more concise version of @complement zeroBits@.---- >>> complement (zeroBits :: Word) == (oneBits :: Word)-- True---- >>> complement (oneBits :: Word) == (zeroBits :: Word)-- True---- = Note---- The constraint on 'oneBits' is arguably too strong. However, as some types-- (such as 'Natural') have undefined 'complement', this is the only safe-- choice.---- @since 4.16oneBits ::(FiniteBits a )=>a oneBits :: forall a. FiniteBits a => a oneBits =a -> a forall a. Bits a => a -> a complement a forall a. Bits a => a zeroBits {-# INLINEoneBits #-}-- | Infix version of 'xor'.---- @since 4.17(.^.) ::(Bits a )=>a ->a ->a .^. :: forall a. Bits a => a -> a -> a (.^.) =a -> a -> a forall a. Bits a => a -> a -> a xor infixl6.^. -- | Infix version of 'shiftR'.---- @since 4.17(.>>.) ::(Bits a )=>a ->Int ->a .>>. :: forall a. Bits a => a -> Int -> a (.>>.) =a -> Int -> a forall a. Bits a => a -> Int -> a shiftR infixl8.>>. -- | Infix version of 'shiftL'.---- @since 4.17(.<<.) ::(Bits a )=>a ->Int ->a .<<. :: forall a. Bits a => a -> Int -> a (.<<.) =a -> Int -> a forall a. Bits a => a -> Int -> a shiftL infixl8.<<. -- | Infix version of 'unsafeShiftR'.---- @since 4.17(!>>.) ::(Bits a )=>a ->Int ->a !>>. :: forall a. Bits a => a -> Int -> a (!>>.) =a -> Int -> a forall a. Bits a => a -> Int -> a unsafeShiftR infixl8!>>. -- | Infix version of 'unsafeShiftL'.---- @since 4.17(!<<.) ::(Bits a )=>a ->Int ->a !<<. :: forall a. Bits a => a -> Int -> a (!<<.) =a -> Int -> a forall a. Bits a => a -> Int -> a unsafeShiftL infixl8!<<. -- | Monoid under bitwise AND.---- >>> getAnd (And 0xab <> And 0x12) :: Word8-- 2---- @since 4.16newtypeAnd a =And {forall a. And a -> a getAnd ::a }derivingnewtype(And a And a -> And a -> Bounded (And a) forall a. a -> a -> Bounded a forall a. Bounded a => And a $cminBound :: forall a. Bounded a => And a minBound :: And a $cmaxBound :: forall a. Bounded a => And a maxBound :: And a Bounded ,-- ^ @since 4.16Int -> And a And a -> Int And a -> [And a] And a -> And a And a -> And a -> [And a] And a -> And a -> And a -> [And a] (And a -> And a) -> (And a -> And a) -> (Int -> And a) -> (And a -> Int) -> (And a -> [And a]) -> (And a -> And a -> [And a]) -> (And a -> And a -> [And a]) -> (And a -> And a -> And a -> [And a]) -> Enum (And a) forall a. Enum a => Int -> And a forall a. Enum a => And a -> Int forall a. Enum a => And a -> [And a] forall a. Enum a => And a -> And a forall a. Enum a => And a -> And a -> [And a] forall a. Enum a => And a -> And a -> And a -> [And a] forall a. (a -> a) -> (a -> a) -> (Int -> a) -> (a -> Int) -> (a -> [a]) -> (a -> a -> [a]) -> (a -> a -> [a]) -> (a -> a -> a -> [a]) -> Enum a $csucc :: forall a. Enum a => And a -> And a succ :: And a -> And a $cpred :: forall a. Enum a => And a -> And a pred :: And a -> And a $ctoEnum :: forall a. Enum a => Int -> And a toEnum :: Int -> And a $cfromEnum :: forall a. Enum a => And a -> Int fromEnum :: And a -> Int $cenumFrom :: forall a. Enum a => And a -> [And a] enumFrom :: And a -> [And a] $cenumFromThen :: forall a. Enum a => And a -> And a -> [And a] enumFromThen :: And a -> And a -> [And a] $cenumFromTo :: forall a. Enum a => And a -> And a -> [And a] enumFromTo :: And a -> And a -> [And a] $cenumFromThenTo :: forall a. Enum a => And a -> And a -> And a -> [And a] enumFromThenTo :: And a -> And a -> And a -> [And a] Enum ,-- ^ @since 4.16Eq (And a) And a Eq (And a) => (And a -> And a -> And a) -> (And a -> And a -> And a) -> (And a -> And a -> And a) -> (And a -> And a) -> (And a -> Int -> And a) -> (And a -> Int -> And a) -> And a -> (Int -> And a) -> (And a -> Int -> And a) -> (And a -> Int -> And a) -> (And a -> Int -> And a) -> (And a -> Int -> Bool) -> (And a -> Maybe Int) -> (And a -> Int) -> (And a -> Bool) -> (And a -> Int -> And a) -> (And a -> Int -> And a) -> (And a -> Int -> And a) -> (And a -> Int -> And a) -> (And a -> Int -> And a) -> (And a -> Int -> And a) -> (And a -> Int) -> Bits (And a) Int -> And a And a -> Bool And a -> Int And a -> Maybe Int And a -> And a And a -> Int -> Bool And a -> Int -> And a And a -> And a -> And a forall a. Eq a => (a -> a -> a) -> (a -> a -> a) -> (a -> a -> a) -> (a -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> a -> (Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> Bool) -> (a -> Maybe Int) -> (a -> Int) -> (a -> Bool) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int) -> Bits a forall a. Bits a => Eq (And a) forall a. Bits a => And a forall a. Bits a => Int -> And a forall a. Bits a => And a -> Bool forall a. Bits a => And a -> Int forall a. Bits a => And a -> Maybe Int forall a. Bits a => And a -> And a forall a. Bits a => And a -> Int -> Bool forall a. Bits a => And a -> Int -> And a forall a. Bits a => And a -> And a -> And a $c.&. :: forall a. Bits a => And a -> And a -> And a .&. :: And a -> And a -> And a $c.|. :: forall a. Bits a => And a -> And a -> And a .|. :: And a -> And a -> And a $cxor :: forall a. Bits a => And a -> And a -> And a xor :: And a -> And a -> And a $ccomplement :: forall a. Bits a => And a -> And a complement :: And a -> And a $cshift :: forall a. Bits a => And a -> Int -> And a shift :: And a -> Int -> And a $crotate :: forall a. Bits a => And a -> Int -> And a rotate :: And a -> Int -> And a $czeroBits :: forall a. Bits a => And a zeroBits :: And a $cbit :: forall a. Bits a => Int -> And a bit :: Int -> And a $csetBit :: forall a. Bits a => And a -> Int -> And a setBit :: And a -> Int -> And a $cclearBit :: forall a. Bits a => And a -> Int -> And a clearBit :: And a -> Int -> And a $ccomplementBit :: forall a. Bits a => And a -> Int -> And a complementBit :: And a -> Int -> And a $ctestBit :: forall a. Bits a => And a -> Int -> Bool testBit :: And a -> Int -> Bool $cbitSizeMaybe :: forall a. Bits a => And a -> Maybe Int bitSizeMaybe :: And a -> Maybe Int $cbitSize :: forall a. Bits a => And a -> Int bitSize :: And a -> Int $cisSigned :: forall a. Bits a => And a -> Bool isSigned :: And a -> Bool $cshiftL :: forall a. Bits a => And a -> Int -> And a shiftL :: And a -> Int -> And a $cunsafeShiftL :: forall a. Bits a => And a -> Int -> And a unsafeShiftL :: And a -> Int -> And a $cshiftR :: forall a. Bits a => And a -> Int -> And a shiftR :: And a -> Int -> And a $cunsafeShiftR :: forall a. Bits a => And a -> Int -> And a unsafeShiftR :: And a -> Int -> And a $crotateL :: forall a. Bits a => And a -> Int -> And a rotateL :: And a -> Int -> And a $crotateR :: forall a. Bits a => And a -> Int -> And a rotateR :: And a -> Int -> And a $cpopCount :: forall a. Bits a => And a -> Int popCount :: And a -> Int Bits ,-- ^ @since 4.16Bits (And a) Bits (And a) => (And a -> Int) -> (And a -> Int) -> (And a -> Int) -> FiniteBits (And a) And a -> Int forall a. FiniteBits a => Bits (And a) forall a. FiniteBits a => And a -> Int forall b. Bits b => (b -> Int) -> (b -> Int) -> (b -> Int) -> FiniteBits b $cfiniteBitSize :: forall a. FiniteBits a => And a -> Int finiteBitSize :: And a -> Int $ccountLeadingZeros :: forall a. FiniteBits a => And a -> Int countLeadingZeros :: And a -> Int $ccountTrailingZeros :: forall a. FiniteBits a => And a -> Int countTrailingZeros :: And a -> Int FiniteBits ,-- ^ @since 4.16And a -> And a -> Bool (And a -> And a -> Bool) -> (And a -> And a -> Bool) -> Eq (And a) forall a. Eq a => And a -> And a -> Bool forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a $c== :: forall a. Eq a => And a -> And a -> Bool == :: And a -> And a -> Bool $c/= :: forall a. Eq a => And a -> And a -> Bool /= :: And a -> And a -> Bool Eq -- ^ @since 4.16)derivingstock(Int -> And a -> ShowS [And a] -> ShowS And a -> String (Int -> And a -> ShowS) -> (And a -> String) -> ([And a] -> ShowS) -> Show (And a) forall a. Show a => Int -> And a -> ShowS forall a. Show a => [And a] -> ShowS forall a. Show a => And a -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a $cshowsPrec :: forall a. Show a => Int -> And a -> ShowS showsPrec :: Int -> And a -> ShowS $cshow :: forall a. Show a => And a -> String show :: And a -> String $cshowList :: forall a. Show a => [And a] -> ShowS showList :: [And a] -> ShowS Show ,-- ^ @since 4.16ReadPrec [And a] ReadPrec (And a) Int -> ReadS (And a) ReadS [And a] (Int -> ReadS (And a)) -> ReadS [And a] -> ReadPrec (And a) -> ReadPrec [And a] -> Read (And a) forall a. Read a => ReadPrec [And a] forall a. Read a => ReadPrec (And a) forall a. Read a => Int -> ReadS (And a) forall a. Read a => ReadS [And a] forall a. (Int -> ReadS a) -> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a $creadsPrec :: forall a. Read a => Int -> ReadS (And a) readsPrec :: Int -> ReadS (And a) $creadList :: forall a. Read a => ReadS [And a] readList :: ReadS [And a] $creadPrec :: forall a. Read a => ReadPrec (And a) readPrec :: ReadPrec (And a) $creadListPrec :: forall a. Read a => ReadPrec [And a] readListPrec :: ReadPrec [And a] Read -- ^ @since 4.16)-- | @since 4.16instance(Bits a )=>Semigroup (And a )whereAnd a x <> :: And a -> And a -> And a <> And a y =a -> And a forall a. a -> And a And (a x a -> a -> a forall a. Bits a => a -> a -> a .&. a y )-- | This constraint is arguably too strong. However,-- as some types (such as 'Natural') have undefined 'complement', this is the-- only safe choice.---- @since 4.16instance(FiniteBits a )=>Monoid (And a )wheremempty :: And a mempty =a -> And a forall a. a -> And a And a forall a. FiniteBits a => a oneBits -- By default, we would get a lazy right fold. This forces the use of a strict-- left fold instead.mconcat :: [And a] -> And a mconcat =(And a -> And a -> And a) -> And a -> [And a] -> And a forall a b. (b -> a -> b) -> b -> [a] -> b List.foldl' And a -> And a -> And a forall a. Semigroup a => a -> a -> a (<>) And a forall a. Monoid a => a mempty {-# INLINEmconcat #-}-- | Monoid under bitwise inclusive OR.---- >>> getIor (Ior 0xab <> Ior 0x12) :: Word8-- 187---- @since 4.16newtypeIor a =Ior {forall a. Ior a -> a getIor ::a }derivingnewtype(Ior a Ior a -> Ior a -> Bounded (Ior a) forall a. a -> a -> Bounded a forall a. Bounded a => Ior a $cminBound :: forall a. Bounded a => Ior a minBound :: Ior a $cmaxBound :: forall a. Bounded a => Ior a maxBound :: Ior a Bounded ,-- ^ @since 4.16Int -> Ior a Ior a -> Int Ior a -> [Ior a] Ior a -> Ior a Ior a -> Ior a -> [Ior a] Ior a -> Ior a -> Ior a -> [Ior a] (Ior a -> Ior a) -> (Ior a -> Ior a) -> (Int -> Ior a) -> (Ior a -> Int) -> (Ior a -> [Ior a]) -> (Ior a -> Ior a -> [Ior a]) -> (Ior a -> Ior a -> [Ior a]) -> (Ior a -> Ior a -> Ior a -> [Ior a]) -> Enum (Ior a) forall a. Enum a => Int -> Ior a forall a. Enum a => Ior a -> Int forall a. Enum a => Ior a -> [Ior a] forall a. Enum a => Ior a -> Ior a forall a. Enum a => Ior a -> Ior a -> [Ior a] forall a. Enum a => Ior a -> Ior a -> Ior a -> [Ior a] forall a. (a -> a) -> (a -> a) -> (Int -> a) -> (a -> Int) -> (a -> [a]) -> (a -> a -> [a]) -> (a -> a -> [a]) -> (a -> a -> a -> [a]) -> Enum a $csucc :: forall a. Enum a => Ior a -> Ior a succ :: Ior a -> Ior a $cpred :: forall a. Enum a => Ior a -> Ior a pred :: Ior a -> Ior a $ctoEnum :: forall a. Enum a => Int -> Ior a toEnum :: Int -> Ior a $cfromEnum :: forall a. Enum a => Ior a -> Int fromEnum :: Ior a -> Int $cenumFrom :: forall a. Enum a => Ior a -> [Ior a] enumFrom :: Ior a -> [Ior a] $cenumFromThen :: forall a. Enum a => Ior a -> Ior a -> [Ior a] enumFromThen :: Ior a -> Ior a -> [Ior a] $cenumFromTo :: forall a. Enum a => Ior a -> Ior a -> [Ior a] enumFromTo :: Ior a -> Ior a -> [Ior a] $cenumFromThenTo :: forall a. Enum a => Ior a -> Ior a -> Ior a -> [Ior a] enumFromThenTo :: Ior a -> Ior a -> Ior a -> [Ior a] Enum ,-- ^ @since 4.16Eq (Ior a) Ior a Eq (Ior a) => (Ior a -> Ior a -> Ior a) -> (Ior a -> Ior a -> Ior a) -> (Ior a -> Ior a -> Ior a) -> (Ior a -> Ior a) -> (Ior a -> Int -> Ior a) -> (Ior a -> Int -> Ior a) -> Ior a -> (Int -> Ior a) -> (Ior a -> Int -> Ior a) -> (Ior a -> Int -> Ior a) -> (Ior a -> Int -> Ior a) -> (Ior a -> Int -> Bool) -> (Ior a -> Maybe Int) -> (Ior a -> Int) -> (Ior a -> Bool) -> (Ior a -> Int -> Ior a) -> (Ior a -> Int -> Ior a) -> (Ior a -> Int -> Ior a) -> (Ior a -> Int -> Ior a) -> (Ior a -> Int -> Ior a) -> (Ior a -> Int -> Ior a) -> (Ior a -> Int) -> Bits (Ior a) Int -> Ior a Ior a -> Bool Ior a -> Int Ior a -> Maybe Int Ior a -> Ior a Ior a -> Int -> Bool Ior a -> Int -> Ior a Ior a -> Ior a -> Ior a forall a. Eq a => (a -> a -> a) -> (a -> a -> a) -> (a -> a -> a) -> (a -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> a -> (Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> Bool) -> (a -> Maybe Int) -> (a -> Int) -> (a -> Bool) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int) -> Bits a forall a. Bits a => Eq (Ior a) forall a. Bits a => Ior a forall a. Bits a => Int -> Ior a forall a. Bits a => Ior a -> Bool forall a. Bits a => Ior a -> Int forall a. Bits a => Ior a -> Maybe Int forall a. Bits a => Ior a -> Ior a forall a. Bits a => Ior a -> Int -> Bool forall a. Bits a => Ior a -> Int -> Ior a forall a. Bits a => Ior a -> Ior a -> Ior a $c.&. :: forall a. Bits a => Ior a -> Ior a -> Ior a .&. :: Ior a -> Ior a -> Ior a $c.|. :: forall a. Bits a => Ior a -> Ior a -> Ior a .|. :: Ior a -> Ior a -> Ior a $cxor :: forall a. Bits a => Ior a -> Ior a -> Ior a xor :: Ior a -> Ior a -> Ior a $ccomplement :: forall a. Bits a => Ior a -> Ior a complement :: Ior a -> Ior a $cshift :: forall a. Bits a => Ior a -> Int -> Ior a shift :: Ior a -> Int -> Ior a $crotate :: forall a. Bits a => Ior a -> Int -> Ior a rotate :: Ior a -> Int -> Ior a $czeroBits :: forall a. Bits a => Ior a zeroBits :: Ior a $cbit :: forall a. Bits a => Int -> Ior a bit :: Int -> Ior a $csetBit :: forall a. Bits a => Ior a -> Int -> Ior a setBit :: Ior a -> Int -> Ior a $cclearBit :: forall a. Bits a => Ior a -> Int -> Ior a clearBit :: Ior a -> Int -> Ior a $ccomplementBit :: forall a. Bits a => Ior a -> Int -> Ior a complementBit :: Ior a -> Int -> Ior a $ctestBit :: forall a. Bits a => Ior a -> Int -> Bool testBit :: Ior a -> Int -> Bool $cbitSizeMaybe :: forall a. Bits a => Ior a -> Maybe Int bitSizeMaybe :: Ior a -> Maybe Int $cbitSize :: forall a. Bits a => Ior a -> Int bitSize :: Ior a -> Int $cisSigned :: forall a. Bits a => Ior a -> Bool isSigned :: Ior a -> Bool $cshiftL :: forall a. Bits a => Ior a -> Int -> Ior a shiftL :: Ior a -> Int -> Ior a $cunsafeShiftL :: forall a. Bits a => Ior a -> Int -> Ior a unsafeShiftL :: Ior a -> Int -> Ior a $cshiftR :: forall a. Bits a => Ior a -> Int -> Ior a shiftR :: Ior a -> Int -> Ior a $cunsafeShiftR :: forall a. Bits a => Ior a -> Int -> Ior a unsafeShiftR :: Ior a -> Int -> Ior a $crotateL :: forall a. Bits a => Ior a -> Int -> Ior a rotateL :: Ior a -> Int -> Ior a $crotateR :: forall a. Bits a => Ior a -> Int -> Ior a rotateR :: Ior a -> Int -> Ior a $cpopCount :: forall a. Bits a => Ior a -> Int popCount :: Ior a -> Int Bits ,-- ^ @since 4.16Bits (Ior a) Bits (Ior a) => (Ior a -> Int) -> (Ior a -> Int) -> (Ior a -> Int) -> FiniteBits (Ior a) Ior a -> Int forall a. FiniteBits a => Bits (Ior a) forall a. FiniteBits a => Ior a -> Int forall b. Bits b => (b -> Int) -> (b -> Int) -> (b -> Int) -> FiniteBits b $cfiniteBitSize :: forall a. FiniteBits a => Ior a -> Int finiteBitSize :: Ior a -> Int $ccountLeadingZeros :: forall a. FiniteBits a => Ior a -> Int countLeadingZeros :: Ior a -> Int $ccountTrailingZeros :: forall a. FiniteBits a => Ior a -> Int countTrailingZeros :: Ior a -> Int FiniteBits ,-- ^ @since 4.16Ior a -> Ior a -> Bool (Ior a -> Ior a -> Bool) -> (Ior a -> Ior a -> Bool) -> Eq (Ior a) forall a. Eq a => Ior a -> Ior a -> Bool forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a $c== :: forall a. Eq a => Ior a -> Ior a -> Bool == :: Ior a -> Ior a -> Bool $c/= :: forall a. Eq a => Ior a -> Ior a -> Bool /= :: Ior a -> Ior a -> Bool Eq -- ^ @since 4.16)derivingstock(Int -> Ior a -> ShowS [Ior a] -> ShowS Ior a -> String (Int -> Ior a -> ShowS) -> (Ior a -> String) -> ([Ior a] -> ShowS) -> Show (Ior a) forall a. Show a => Int -> Ior a -> ShowS forall a. Show a => [Ior a] -> ShowS forall a. Show a => Ior a -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a $cshowsPrec :: forall a. Show a => Int -> Ior a -> ShowS showsPrec :: Int -> Ior a -> ShowS $cshow :: forall a. Show a => Ior a -> String show :: Ior a -> String $cshowList :: forall a. Show a => [Ior a] -> ShowS showList :: [Ior a] -> ShowS Show ,-- ^ @since 4.16ReadPrec [Ior a] ReadPrec (Ior a) Int -> ReadS (Ior a) ReadS [Ior a] (Int -> ReadS (Ior a)) -> ReadS [Ior a] -> ReadPrec (Ior a) -> ReadPrec [Ior a] -> Read (Ior a) forall a. Read a => ReadPrec [Ior a] forall a. Read a => ReadPrec (Ior a) forall a. Read a => Int -> ReadS (Ior a) forall a. Read a => ReadS [Ior a] forall a. (Int -> ReadS a) -> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a $creadsPrec :: forall a. Read a => Int -> ReadS (Ior a) readsPrec :: Int -> ReadS (Ior a) $creadList :: forall a. Read a => ReadS [Ior a] readList :: ReadS [Ior a] $creadPrec :: forall a. Read a => ReadPrec (Ior a) readPrec :: ReadPrec (Ior a) $creadListPrec :: forall a. Read a => ReadPrec [Ior a] readListPrec :: ReadPrec [Ior a] Read -- ^ @since 4.16)-- | @since 4.16instance(Bits a )=>Semigroup (Ior a )whereIor a x <> :: Ior a -> Ior a -> Ior a <> Ior a y =a -> Ior a forall a. a -> Ior a Ior (a x a -> a -> a forall a. Bits a => a -> a -> a .|. a y )-- | @since 4.16instance(Bits a )=>Monoid (Ior a )wheremempty :: Ior a mempty =a -> Ior a forall a. a -> Ior a Ior a forall a. Bits a => a zeroBits -- By default, we would get a lazy right fold. This forces the use of a strict-- left fold instead.mconcat :: [Ior a] -> Ior a mconcat =(Ior a -> Ior a -> Ior a) -> Ior a -> [Ior a] -> Ior a forall a b. (b -> a -> b) -> b -> [a] -> b List.foldl' Ior a -> Ior a -> Ior a forall a. Semigroup a => a -> a -> a (<>) Ior a forall a. Monoid a => a mempty {-# INLINEmconcat #-}-- | Monoid under bitwise XOR.---- >>> getXor (Xor 0xab <> Xor 0x12) :: Word8-- 185---- @since 4.16newtypeXor a =Xor {forall a. Xor a -> a getXor ::a }derivingnewtype(Xor a Xor a -> Xor a -> Bounded (Xor a) forall a. a -> a -> Bounded a forall a. Bounded a => Xor a $cminBound :: forall a. Bounded a => Xor a minBound :: Xor a $cmaxBound :: forall a. Bounded a => Xor a maxBound :: Xor a Bounded ,-- ^ @since 4.16Int -> Xor a Xor a -> Int Xor a -> [Xor a] Xor a -> Xor a Xor a -> Xor a -> [Xor a] Xor a -> Xor a -> Xor a -> [Xor a] (Xor a -> Xor a) -> (Xor a -> Xor a) -> (Int -> Xor a) -> (Xor a -> Int) -> (Xor a -> [Xor a]) -> (Xor a -> Xor a -> [Xor a]) -> (Xor a -> Xor a -> [Xor a]) -> (Xor a -> Xor a -> Xor a -> [Xor a]) -> Enum (Xor a) forall a. Enum a => Int -> Xor a forall a. Enum a => Xor a -> Int forall a. Enum a => Xor a -> [Xor a] forall a. Enum a => Xor a -> Xor a forall a. Enum a => Xor a -> Xor a -> [Xor a] forall a. Enum a => Xor a -> Xor a -> Xor a -> [Xor a] forall a. (a -> a) -> (a -> a) -> (Int -> a) -> (a -> Int) -> (a -> [a]) -> (a -> a -> [a]) -> (a -> a -> [a]) -> (a -> a -> a -> [a]) -> Enum a $csucc :: forall a. Enum a => Xor a -> Xor a succ :: Xor a -> Xor a $cpred :: forall a. Enum a => Xor a -> Xor a pred :: Xor a -> Xor a $ctoEnum :: forall a. Enum a => Int -> Xor a toEnum :: Int -> Xor a $cfromEnum :: forall a. Enum a => Xor a -> Int fromEnum :: Xor a -> Int $cenumFrom :: forall a. Enum a => Xor a -> [Xor a] enumFrom :: Xor a -> [Xor a] $cenumFromThen :: forall a. Enum a => Xor a -> Xor a -> [Xor a] enumFromThen :: Xor a -> Xor a -> [Xor a] $cenumFromTo :: forall a. Enum a => Xor a -> Xor a -> [Xor a] enumFromTo :: Xor a -> Xor a -> [Xor a] $cenumFromThenTo :: forall a. Enum a => Xor a -> Xor a -> Xor a -> [Xor a] enumFromThenTo :: Xor a -> Xor a -> Xor a -> [Xor a] Enum ,-- ^ @since 4.16Eq (Xor a) Xor a Eq (Xor a) => (Xor a -> Xor a -> Xor a) -> (Xor a -> Xor a -> Xor a) -> (Xor a -> Xor a -> Xor a) -> (Xor a -> Xor a) -> (Xor a -> Int -> Xor a) -> (Xor a -> Int -> Xor a) -> Xor a -> (Int -> Xor a) -> (Xor a -> Int -> Xor a) -> (Xor a -> Int -> Xor a) -> (Xor a -> Int -> Xor a) -> (Xor a -> Int -> Bool) -> (Xor a -> Maybe Int) -> (Xor a -> Int) -> (Xor a -> Bool) -> (Xor a -> Int -> Xor a) -> (Xor a -> Int -> Xor a) -> (Xor a -> Int -> Xor a) -> (Xor a -> Int -> Xor a) -> (Xor a -> Int -> Xor a) -> (Xor a -> Int -> Xor a) -> (Xor a -> Int) -> Bits (Xor a) Int -> Xor a Xor a -> Bool Xor a -> Int Xor a -> Maybe Int Xor a -> Xor a Xor a -> Int -> Bool Xor a -> Int -> Xor a Xor a -> Xor a -> Xor a forall a. Eq a => (a -> a -> a) -> (a -> a -> a) -> (a -> a -> a) -> (a -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> a -> (Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> Bool) -> (a -> Maybe Int) -> (a -> Int) -> (a -> Bool) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int) -> Bits a forall a. Bits a => Eq (Xor a) forall a. Bits a => Xor a forall a. Bits a => Int -> Xor a forall a. Bits a => Xor a -> Bool forall a. Bits a => Xor a -> Int forall a. Bits a => Xor a -> Maybe Int forall a. Bits a => Xor a -> Xor a forall a. Bits a => Xor a -> Int -> Bool forall a. Bits a => Xor a -> Int -> Xor a forall a. Bits a => Xor a -> Xor a -> Xor a $c.&. :: forall a. Bits a => Xor a -> Xor a -> Xor a .&. :: Xor a -> Xor a -> Xor a $c.|. :: forall a. Bits a => Xor a -> Xor a -> Xor a .|. :: Xor a -> Xor a -> Xor a $cxor :: forall a. Bits a => Xor a -> Xor a -> Xor a xor :: Xor a -> Xor a -> Xor a $ccomplement :: forall a. Bits a => Xor a -> Xor a complement :: Xor a -> Xor a $cshift :: forall a. Bits a => Xor a -> Int -> Xor a shift :: Xor a -> Int -> Xor a $crotate :: forall a. Bits a => Xor a -> Int -> Xor a rotate :: Xor a -> Int -> Xor a $czeroBits :: forall a. Bits a => Xor a zeroBits :: Xor a $cbit :: forall a. Bits a => Int -> Xor a bit :: Int -> Xor a $csetBit :: forall a. Bits a => Xor a -> Int -> Xor a setBit :: Xor a -> Int -> Xor a $cclearBit :: forall a. Bits a => Xor a -> Int -> Xor a clearBit :: Xor a -> Int -> Xor a $ccomplementBit :: forall a. Bits a => Xor a -> Int -> Xor a complementBit :: Xor a -> Int -> Xor a $ctestBit :: forall a. Bits a => Xor a -> Int -> Bool testBit :: Xor a -> Int -> Bool $cbitSizeMaybe :: forall a. Bits a => Xor a -> Maybe Int bitSizeMaybe :: Xor a -> Maybe Int $cbitSize :: forall a. Bits a => Xor a -> Int bitSize :: Xor a -> Int $cisSigned :: forall a. Bits a => Xor a -> Bool isSigned :: Xor a -> Bool $cshiftL :: forall a. Bits a => Xor a -> Int -> Xor a shiftL :: Xor a -> Int -> Xor a $cunsafeShiftL :: forall a. Bits a => Xor a -> Int -> Xor a unsafeShiftL :: Xor a -> Int -> Xor a $cshiftR :: forall a. Bits a => Xor a -> Int -> Xor a shiftR :: Xor a -> Int -> Xor a $cunsafeShiftR :: forall a. Bits a => Xor a -> Int -> Xor a unsafeShiftR :: Xor a -> Int -> Xor a $crotateL :: forall a. Bits a => Xor a -> Int -> Xor a rotateL :: Xor a -> Int -> Xor a $crotateR :: forall a. Bits a => Xor a -> Int -> Xor a rotateR :: Xor a -> Int -> Xor a $cpopCount :: forall a. Bits a => Xor a -> Int popCount :: Xor a -> Int Bits ,-- ^ @since 4.16Bits (Xor a) Bits (Xor a) => (Xor a -> Int) -> (Xor a -> Int) -> (Xor a -> Int) -> FiniteBits (Xor a) Xor a -> Int forall a. FiniteBits a => Bits (Xor a) forall a. FiniteBits a => Xor a -> Int forall b. Bits b => (b -> Int) -> (b -> Int) -> (b -> Int) -> FiniteBits b $cfiniteBitSize :: forall a. FiniteBits a => Xor a -> Int finiteBitSize :: Xor a -> Int $ccountLeadingZeros :: forall a. FiniteBits a => Xor a -> Int countLeadingZeros :: Xor a -> Int $ccountTrailingZeros :: forall a. FiniteBits a => Xor a -> Int countTrailingZeros :: Xor a -> Int FiniteBits ,-- ^ @since 4.16Xor a -> Xor a -> Bool (Xor a -> Xor a -> Bool) -> (Xor a -> Xor a -> Bool) -> Eq (Xor a) forall a. Eq a => Xor a -> Xor a -> Bool forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a $c== :: forall a. Eq a => Xor a -> Xor a -> Bool == :: Xor a -> Xor a -> Bool $c/= :: forall a. Eq a => Xor a -> Xor a -> Bool /= :: Xor a -> Xor a -> Bool Eq -- ^ @since 4.16)derivingstock(Int -> Xor a -> ShowS [Xor a] -> ShowS Xor a -> String (Int -> Xor a -> ShowS) -> (Xor a -> String) -> ([Xor a] -> ShowS) -> Show (Xor a) forall a. Show a => Int -> Xor a -> ShowS forall a. Show a => [Xor a] -> ShowS forall a. Show a => Xor a -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a $cshowsPrec :: forall a. Show a => Int -> Xor a -> ShowS showsPrec :: Int -> Xor a -> ShowS $cshow :: forall a. Show a => Xor a -> String show :: Xor a -> String $cshowList :: forall a. Show a => [Xor a] -> ShowS showList :: [Xor a] -> ShowS Show ,-- ^ @since 4.16ReadPrec [Xor a] ReadPrec (Xor a) Int -> ReadS (Xor a) ReadS [Xor a] (Int -> ReadS (Xor a)) -> ReadS [Xor a] -> ReadPrec (Xor a) -> ReadPrec [Xor a] -> Read (Xor a) forall a. Read a => ReadPrec [Xor a] forall a. Read a => ReadPrec (Xor a) forall a. Read a => Int -> ReadS (Xor a) forall a. Read a => ReadS [Xor a] forall a. (Int -> ReadS a) -> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a $creadsPrec :: forall a. Read a => Int -> ReadS (Xor a) readsPrec :: Int -> ReadS (Xor a) $creadList :: forall a. Read a => ReadS [Xor a] readList :: ReadS [Xor a] $creadPrec :: forall a. Read a => ReadPrec (Xor a) readPrec :: ReadPrec (Xor a) $creadListPrec :: forall a. Read a => ReadPrec [Xor a] readListPrec :: ReadPrec [Xor a] Read -- ^ @since 4.16)-- | @since 4.16instance(Bits a )=>Semigroup (Xor a )whereXor a x <> :: Xor a -> Xor a -> Xor a <> Xor a y =a -> Xor a forall a. a -> Xor a Xor (a x a -> a -> a forall a. Bits a => a -> a -> a `xor` a y )-- | @since 4.16instance(Bits a )=>Monoid (Xor a )wheremempty :: Xor a mempty =a -> Xor a forall a. a -> Xor a Xor a forall a. Bits a => a zeroBits -- By default, we would get a lazy right fold. This forces the use of a strict-- left fold instead.mconcat :: [Xor a] -> Xor a mconcat =(Xor a -> Xor a -> Xor a) -> Xor a -> [Xor a] -> Xor a forall a b. (b -> a -> b) -> b -> [a] -> b List.foldl' Xor a -> Xor a -> Xor a forall a. Semigroup a => a -> a -> a (<>) Xor a forall a. Monoid a => a mempty {-# INLINEmconcat #-}-- | Monoid under bitwise \'equality\'; defined as @1@ if the corresponding-- bits match, and @0@ otherwise.---- >>> getIff (Iff 0xab <> Iff 0x12) :: Word8-- 70---- @since 4.16newtypeIff a =Iff {forall a. Iff a -> a getIff ::a }derivingnewtype(Iff a Iff a -> Iff a -> Bounded (Iff a) forall a. a -> a -> Bounded a forall a. Bounded a => Iff a $cminBound :: forall a. Bounded a => Iff a minBound :: Iff a $cmaxBound :: forall a. Bounded a => Iff a maxBound :: Iff a Bounded ,-- ^ @since 4.16Int -> Iff a Iff a -> Int Iff a -> [Iff a] Iff a -> Iff a Iff a -> Iff a -> [Iff a] Iff a -> Iff a -> Iff a -> [Iff a] (Iff a -> Iff a) -> (Iff a -> Iff a) -> (Int -> Iff a) -> (Iff a -> Int) -> (Iff a -> [Iff a]) -> (Iff a -> Iff a -> [Iff a]) -> (Iff a -> Iff a -> [Iff a]) -> (Iff a -> Iff a -> Iff a -> [Iff a]) -> Enum (Iff a) forall a. Enum a => Int -> Iff a forall a. Enum a => Iff a -> Int forall a. Enum a => Iff a -> [Iff a] forall a. Enum a => Iff a -> Iff a forall a. Enum a => Iff a -> Iff a -> [Iff a] forall a. Enum a => Iff a -> Iff a -> Iff a -> [Iff a] forall a. (a -> a) -> (a -> a) -> (Int -> a) -> (a -> Int) -> (a -> [a]) -> (a -> a -> [a]) -> (a -> a -> [a]) -> (a -> a -> a -> [a]) -> Enum a $csucc :: forall a. Enum a => Iff a -> Iff a succ :: Iff a -> Iff a $cpred :: forall a. Enum a => Iff a -> Iff a pred :: Iff a -> Iff a $ctoEnum :: forall a. Enum a => Int -> Iff a toEnum :: Int -> Iff a $cfromEnum :: forall a. Enum a => Iff a -> Int fromEnum :: Iff a -> Int $cenumFrom :: forall a. Enum a => Iff a -> [Iff a] enumFrom :: Iff a -> [Iff a] $cenumFromThen :: forall a. Enum a => Iff a -> Iff a -> [Iff a] enumFromThen :: Iff a -> Iff a -> [Iff a] $cenumFromTo :: forall a. Enum a => Iff a -> Iff a -> [Iff a] enumFromTo :: Iff a -> Iff a -> [Iff a] $cenumFromThenTo :: forall a. Enum a => Iff a -> Iff a -> Iff a -> [Iff a] enumFromThenTo :: Iff a -> Iff a -> Iff a -> [Iff a] Enum ,-- ^ @since 4.16Eq (Iff a) Iff a Eq (Iff a) => (Iff a -> Iff a -> Iff a) -> (Iff a -> Iff a -> Iff a) -> (Iff a -> Iff a -> Iff a) -> (Iff a -> Iff a) -> (Iff a -> Int -> Iff a) -> (Iff a -> Int -> Iff a) -> Iff a -> (Int -> Iff a) -> (Iff a -> Int -> Iff a) -> (Iff a -> Int -> Iff a) -> (Iff a -> Int -> Iff a) -> (Iff a -> Int -> Bool) -> (Iff a -> Maybe Int) -> (Iff a -> Int) -> (Iff a -> Bool) -> (Iff a -> Int -> Iff a) -> (Iff a -> Int -> Iff a) -> (Iff a -> Int -> Iff a) -> (Iff a -> Int -> Iff a) -> (Iff a -> Int -> Iff a) -> (Iff a -> Int -> Iff a) -> (Iff a -> Int) -> Bits (Iff a) Int -> Iff a Iff a -> Bool Iff a -> Int Iff a -> Maybe Int Iff a -> Iff a Iff a -> Int -> Bool Iff a -> Int -> Iff a Iff a -> Iff a -> Iff a forall a. Eq a => (a -> a -> a) -> (a -> a -> a) -> (a -> a -> a) -> (a -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> a -> (Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> Bool) -> (a -> Maybe Int) -> (a -> Int) -> (a -> Bool) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int -> a) -> (a -> Int) -> Bits a forall a. Bits a => Eq (Iff a) forall a. Bits a => Iff a forall a. Bits a => Int -> Iff a forall a. Bits a => Iff a -> Bool forall a. Bits a => Iff a -> Int forall a. Bits a => Iff a -> Maybe Int forall a. Bits a => Iff a -> Iff a forall a. Bits a => Iff a -> Int -> Bool forall a. Bits a => Iff a -> Int -> Iff a forall a. Bits a => Iff a -> Iff a -> Iff a $c.&. :: forall a. Bits a => Iff a -> Iff a -> Iff a .&. :: Iff a -> Iff a -> Iff a $c.|. :: forall a. Bits a => Iff a -> Iff a -> Iff a .|. :: Iff a -> Iff a -> Iff a $cxor :: forall a. Bits a => Iff a -> Iff a -> Iff a xor :: Iff a -> Iff a -> Iff a $ccomplement :: forall a. Bits a => Iff a -> Iff a complement :: Iff a -> Iff a $cshift :: forall a. Bits a => Iff a -> Int -> Iff a shift :: Iff a -> Int -> Iff a $crotate :: forall a. Bits a => Iff a -> Int -> Iff a rotate :: Iff a -> Int -> Iff a $czeroBits :: forall a. Bits a => Iff a zeroBits :: Iff a $cbit :: forall a. Bits a => Int -> Iff a bit :: Int -> Iff a $csetBit :: forall a. Bits a => Iff a -> Int -> Iff a setBit :: Iff a -> Int -> Iff a $cclearBit :: forall a. Bits a => Iff a -> Int -> Iff a clearBit :: Iff a -> Int -> Iff a $ccomplementBit :: forall a. Bits a => Iff a -> Int -> Iff a complementBit :: Iff a -> Int -> Iff a $ctestBit :: forall a. Bits a => Iff a -> Int -> Bool testBit :: Iff a -> Int -> Bool $cbitSizeMaybe :: forall a. Bits a => Iff a -> Maybe Int bitSizeMaybe :: Iff a -> Maybe Int $cbitSize :: forall a. Bits a => Iff a -> Int bitSize :: Iff a -> Int $cisSigned :: forall a. Bits a => Iff a -> Bool isSigned :: Iff a -> Bool $cshiftL :: forall a. Bits a => Iff a -> Int -> Iff a shiftL :: Iff a -> Int -> Iff a $cunsafeShiftL :: forall a. Bits a => Iff a -> Int -> Iff a unsafeShiftL :: Iff a -> Int -> Iff a $cshiftR :: forall a. Bits a => Iff a -> Int -> Iff a shiftR :: Iff a -> Int -> Iff a $cunsafeShiftR :: forall a. Bits a => Iff a -> Int -> Iff a unsafeShiftR :: Iff a -> Int -> Iff a $crotateL :: forall a. Bits a => Iff a -> Int -> Iff a rotateL :: Iff a -> Int -> Iff a $crotateR :: forall a. Bits a => Iff a -> Int -> Iff a rotateR :: Iff a -> Int -> Iff a $cpopCount :: forall a. Bits a => Iff a -> Int popCount :: Iff a -> Int Bits ,-- ^ @since 4.16Bits (Iff a) Bits (Iff a) => (Iff a -> Int) -> (Iff a -> Int) -> (Iff a -> Int) -> FiniteBits (Iff a) Iff a -> Int forall a. FiniteBits a => Bits (Iff a) forall a. FiniteBits a => Iff a -> Int forall b. Bits b => (b -> Int) -> (b -> Int) -> (b -> Int) -> FiniteBits b $cfiniteBitSize :: forall a. FiniteBits a => Iff a -> Int finiteBitSize :: Iff a -> Int $ccountLeadingZeros :: forall a. FiniteBits a => Iff a -> Int countLeadingZeros :: Iff a -> Int $ccountTrailingZeros :: forall a. FiniteBits a => Iff a -> Int countTrailingZeros :: Iff a -> Int FiniteBits ,-- ^ @since 4.16Iff a -> Iff a -> Bool (Iff a -> Iff a -> Bool) -> (Iff a -> Iff a -> Bool) -> Eq (Iff a) forall a. Eq a => Iff a -> Iff a -> Bool forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a $c== :: forall a. Eq a => Iff a -> Iff a -> Bool == :: Iff a -> Iff a -> Bool $c/= :: forall a. Eq a => Iff a -> Iff a -> Bool /= :: Iff a -> Iff a -> Bool Eq -- ^ @since 4.16)derivingstock(Int -> Iff a -> ShowS [Iff a] -> ShowS Iff a -> String (Int -> Iff a -> ShowS) -> (Iff a -> String) -> ([Iff a] -> ShowS) -> Show (Iff a) forall a. Show a => Int -> Iff a -> ShowS forall a. Show a => [Iff a] -> ShowS forall a. Show a => Iff a -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a $cshowsPrec :: forall a. Show a => Int -> Iff a -> ShowS showsPrec :: Int -> Iff a -> ShowS $cshow :: forall a. Show a => Iff a -> String show :: Iff a -> String $cshowList :: forall a. Show a => [Iff a] -> ShowS showList :: [Iff a] -> ShowS Show ,-- ^ @since 4.16ReadPrec [Iff a] ReadPrec (Iff a) Int -> ReadS (Iff a) ReadS [Iff a] (Int -> ReadS (Iff a)) -> ReadS [Iff a] -> ReadPrec (Iff a) -> ReadPrec [Iff a] -> Read (Iff a) forall a. Read a => ReadPrec [Iff a] forall a. Read a => ReadPrec (Iff a) forall a. Read a => Int -> ReadS (Iff a) forall a. Read a => ReadS [Iff a] forall a. (Int -> ReadS a) -> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a $creadsPrec :: forall a. Read a => Int -> ReadS (Iff a) readsPrec :: Int -> ReadS (Iff a) $creadList :: forall a. Read a => ReadS [Iff a] readList :: ReadS [Iff a] $creadPrec :: forall a. Read a => ReadPrec (Iff a) readPrec :: ReadPrec (Iff a) $creadListPrec :: forall a. Read a => ReadPrec [Iff a] readListPrec :: ReadPrec [Iff a] Read -- ^ @since 4.16)-- | This constraint is arguably-- too strong. However, as some types (such as 'Natural') have undefined-- 'complement', this is the only safe choice.---- @since 4.16instance(FiniteBits a )=>Semigroup (Iff a )whereIff a x <> :: Iff a -> Iff a -> Iff a <> Iff a y =a -> Iff a forall a. a -> Iff a Iff (a -> Iff a) -> (a -> a) -> a -> Iff a forall b c a. (b -> c) -> (a -> b) -> a -> c . a -> a forall a. Bits a => a -> a complement (a -> Iff a) -> a -> Iff a forall a b. (a -> b) -> a -> b $ (a x a -> a -> a forall a. Bits a => a -> a -> a `xor` a y )-- | This constraint is arguably-- too strong. However, as some types (such as 'Natural') have undefined-- 'complement', this is the only safe choice.---- @since 4.16instance(FiniteBits a )=>Monoid (Iff a )wheremempty :: Iff a mempty =a -> Iff a forall a. a -> Iff a Iff a forall a. FiniteBits a => a oneBits -- By default, we would get a lazy right fold. This forces the use of a strict-- left fold instead.mconcat :: [Iff a] -> Iff a mconcat =(Iff a -> Iff a -> Iff a) -> Iff a -> [Iff a] -> Iff a forall a b. (b -> a -> b) -> b -> [a] -> b List.foldl' Iff a -> Iff a -> Iff a forall a. Semigroup a => a -> a -> a (<>) Iff a forall a. Monoid a => a mempty {-# INLINEmconcat #-}