module Data.Semigroup.Option.Instances where
import Control.Applicative
import Control.Lens (toListOf)
import Data.Default
import Data.Functor.Adjunction (unzipR)
import qualified Data.List
import Data.Maybe
import Data.Semigroup
import Data.Traversable (traverse)
import Data.Typeable
import Text.Numeral.Roman (toRoman)
instance Num a => Num (Option a) where
(+) = liftA2 (+)
() = liftA2 ()
(*) = liftA2 (*)
abs = fmap abs
signum = fmap signum
fromInteger = pure . fromInteger
instance Integral a => Integral (Option a) where
quotRem x y = unzipR $ liftA2 quotRem x y
toInteger = toInteger . get where get = (head.toListOf traverse)
instance Real a => Real (Option a) where
toRational = toRational . get where get = (head.toListOf traverse)
instance Enum a => Enum (Option a) where
fromEnum = fromEnum . get where get = (head.toListOf traverse)
toEnum = pure . toEnum
instance Num a => Num (First a) where
(+) = liftA2 (+)
() = liftA2 ()
(*) = liftA2 (*)
abs = fmap abs
signum = fmap signum
fromInteger = pure . fromInteger
instance Integral a => Integral (First a) where
quotRem x y = unzipR $ liftA2 quotRem x y
toInteger = toInteger . get where get = (head.toListOf traverse)
instance Real a => Real (First a) where
toRational = toRational . get where get = (head.toListOf traverse)