{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Data.Finitary.TH where
import Foreign.Storable (Storable, sizeOf)
import Language.Haskell.TH (Q, Type(..), TyLit(..), Exp(..), Lit(..))
charCardinality :: Q Type
charCardinality :: Q Type
charCardinality = Type -> Q Type
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Type -> Q Type) -> (Char -> Type) -> Char -> Q Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TyLit -> Type
LitT (TyLit -> Type) -> (Char -> TyLit) -> Char -> Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> TyLit
NumTyLit (Integer -> TyLit) -> (Char -> Integer) -> Char -> TyLit
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Integer) -> (Char -> Int) -> Char -> Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ 1) (Int -> Int) -> (Char -> Int) -> Char -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
forall a. Enum a => a -> Int
fromEnum (Char -> Q Type) -> Char -> Q Type
forall a b. (a -> b) -> a -> b
$ Bounded Char => Char
forall a. Bounded a => a
maxBound @Char
cardinalityOf :: forall a . (Storable a) => Q Type
cardinalityOf :: Q Type
cardinalityOf = Type -> Q Type
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Type -> Q Type) -> (Integer -> Type) -> Integer -> Q Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TyLit -> Type
LitT (TyLit -> Type) -> (Integer -> TyLit) -> Integer -> Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> TyLit
NumTyLit (Integer -> TyLit) -> (Integer -> Integer) -> Integer -> TyLit
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Integer] -> Integer
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
product ([Integer] -> Integer)
-> (Integer -> [Integer]) -> Integer -> Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Integer -> [Integer]
forall a. Int -> a -> [a]
replicate (a -> Int
forall a. Storable a => a -> Int
sizeOf @a a
forall a. HasCallStack => a
undefined Int -> Int -> Int
forall a. Num a => a -> a -> a
* 8) (Integer -> Q Type) -> Integer -> Q Type
forall a b. (a -> b) -> a -> b
$ 2
adjustmentOf :: forall a . (Integral a, Bounded a) => Q Exp
adjustmentOf :: Q Exp
adjustmentOf = Exp -> Q Exp
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Exp -> Q Exp) -> (a -> Exp) -> a -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Lit -> Exp
LitE (Lit -> Exp) -> (a -> Lit) -> a -> Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Lit
IntegerL (Integer -> Lit) -> (a -> Integer) -> a -> Lit
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ 1) (Integer -> Integer) -> (a -> Integer) -> a -> Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integral a, Num Integer) => a -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral @_ @Integer (a -> Q Exp) -> a -> Q Exp
forall a b. (a -> b) -> a -> b
$ Bounded a => a
forall a. Bounded a => a
maxBound @a