fir-0.1.0.0: src/Data/Type/Nat.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeFamilyDependencies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-|
Module: Data.Type.Maybe
This module defines some arithmetic operations on type-level natural numbers.
-}
module Data.Type.Nat where
-- base
import GHC.TypeNats
( Nat, Div, Log2
, type (+), type (-), type (*), type (^)
)
--------------------------------------------------------------------------
-- | Round @n@ up to the nearest multiple of @r@.
type RoundUp n r
= ( ( n + r - 1 ) `Div` r ) * r
type family NextPositivePowerOf2 (n :: Nat) :: Nat where
NextPositivePowerOf2 0 = 1
NextPositivePowerOf2 n = NextPowerOf2 n
type family NextPowerOf2 (n :: Nat) :: Nat where
NextPowerOf2 0 = 0
NextPowerOf2 1 = 1
NextPowerOf2 n = 2 ^ ( Log2 (n-1) + 1 ) -- Log2 x is actually Floor ( Log2 x )
type family Succ ( n :: Nat ) = ( m :: Nat ) | m -> n where
Succ 0 = 1
Succ 1 = 2
Succ 2 = 3
Succ 3 = 4
Succ 4 = 5
Succ 5 = 6
Succ 6 = 7
Succ 7 = 8
Succ 8 = 9
Succ 9 = 10
Succ 10 = 11
Succ 11 = 12
Succ 12 = 13
Succ 13 = 14
Succ 14 = 15
Succ 15 = 16
Succ 16 = 17
Succ 17 = 18
Succ 18 = 19
Succ 19 = 20
Succ 20 = 21
Succ 21 = 22
Succ 22 = 23
Succ 23 = 24
Succ 24 = 25
Succ 25 = 26
Succ 26 = 27
Succ 27 = 28
Succ 28 = 29
Succ 29 = 30
Succ 30 = 31
Succ 31 = 32
Succ 32 = 33
Succ 33 = 34
Succ 34 = 35
Succ 35 = 36
Succ 36 = 37
Succ 37 = 38
Succ 38 = 39
Succ 39 = 40
Succ 40 = 41
Succ 41 = 42
Succ 42 = 43
Succ 43 = 44
Succ 44 = 45
Succ 45 = 46
Succ 46 = 47
Succ 47 = 48
Succ 48 = 49
Succ 49 = 50
Succ 50 = 51
Succ 51 = 52
Succ 52 = 53
Succ 53 = 54
Succ 54 = 55
Succ 55 = 56
Succ 56 = 57
Succ 57 = 58
Succ 58 = 59
Succ 59 = 60
Succ 60 = 61
Succ 61 = 62
Succ 62 = 63
Succ 63 = 64
Succ 64 = 65