packages feed

fastmemo-0.1.2: src/Data/Function/FastMemo/Int.hs

{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Data.Function.FastMemo.Int () where

import Data.Function.FastMemo.Class (Memoizable (..))
import Data.Function.FastMemo.Word ()
import Data.Int
import Data.Word

deriving via IntegralConversion Word Int instance Memoizable Int

deriving via IntegralConversion Word8 Int8 instance Memoizable Int8

deriving via IntegralConversion Word16 Int16 instance Memoizable Int16

deriving via IntegralConversion Word32 Int32 instance Memoizable Int32

deriving via IntegralConversion Word64 Int64 instance Memoizable Int64

newtype IntegralConversion b a = IntegralConversion a
  deriving (Enum, Num, Eq, Ord, Real, Integral)

instance (Integral a, Integral b, Memoizable b) => Memoizable (IntegralConversion b a) where
  memoize f = memoize (f . fromIntegral) . (fromIntegral :: IntegralConversion b a -> b)