{-# LANGUAGE AllowAmbiguousTypes #-} module Util where import qualified Data.List as L import Numeric.Natural replicateA :: Applicative p => Natural -> p a -> p [a] replicateA n = sequenceA . L.genericReplicate n card :: ∀ a . (Bounded a, Enum a) => Natural card = L.genericLength [minBound @a..] fromEnum' :: (Bounded a, Enum a) => a -> Natural fromEnum' a = L.genericLength [minBound..a] - 1 toEnum' :: (Bounded a, Enum a) => Natural -> a toEnum' = L.genericIndex [minBound..]