-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Provides a wrapper for deriving word types with fewer bits.
--   
--   Provdes the <a>OddWord</a> type, which wraps an existing integer type
--   and exposes a subset of its bits as a new narrower word type. Includes
--   predefined type synonyms for all the odd sized words up to 63 bits.
@package OddWord
@version 1.0.2.0

module Data.Word.Odd

-- | <a>OddWord</a> provides a range of unsigned integer word types with a
--   length in bits encoded at the type level. The first type parameter
--   <tt>a</tt> must supply an integer type which can hold at least as many
--   bits as required for the <a>OddWord</a>. The second type paramter
--   <tt>n</tt> then encodes the length in bits which the <a>OddWord</a>
--   will be restricted to.
--   
--   The length of the <a>OddWord</a> can be encoded as a string of binary
--   digits using the <a>One</a>, <a>Zero</a>, and <tt>()</tt> type
--   constructors. The outermost constructor specifies the most significant
--   digit and each subsequent digit is nested inside the previous type
--   constructor via its type parameter. Hence, the encoding is terminated
--   by the <tt>()</tt> type constructor. For example, the number 4 would
--   be expressed as: <tt>One (Zero (Zero ()))</tt>.
--   
--   Alternatively, if the compiler supports type-level naturals then these
--   can be used via the <a>Lit</a> type constructor. For example, the
--   number 4 can be expressed as: <tt>Lit 4</tt>.
--   
--   To supply a complete example, a 4-bit integer type could be built from
--   a <a>Word8</a> and specified as either <tt>OddWord Word8 (One (Zero
--   (Zero ())))</tt> or <tt>OddWord Word8 (Lit 4)</tt>.
--   
--   The behaviour of an <a>OddWord</a> is undefined if the specified
--   length is greater than that of the underlying integer type. The
--   behaviour is also undefined if the specified length is equal to that
--   of the underlying integer type and that type is also signed.
data OddWord a n

-- | Intances of <a>TypeNum</a> represent type-level numbers.
class TypeNum a

-- | Represents a type-level number with a leading one bit followed by the
--   string of digits specified by <tt>a</tt>.
data One a

-- | Represents a type-level number with a placeholder zero bit followed by
--   the string of digits specified by <tt>a</tt>.
data Zero a

-- | Converts a native GHC type-level natural into one usable by this
--   library. This requires the <tt>DataKinds</tt> extension.
data Lit :: Nat -> *

-- | Required to implement <a>FiniteBits</a> for an <a>OddWord</a> based on
--   type <tt>a</tt>.
class Bits a => FiniteBitsBase a

-- | Count the leading zeros on a <tt>w</tt>-bit wide word.
subWordClz :: FiniteBitsBase a => Int -> a -> Int

-- | Count the trailing zeros on a <tt>w</tt>-bit wide word.
subWordCtz :: FiniteBitsBase a => Int -> a -> Int
type Word1 = OddWord Word8 (One ())
type Word2 = OddWord Word8 (One (Zero ()))
type Word3 = OddWord Word8 (One (One ()))
type Word4 = OddWord Word8 (One (Zero (Zero ())))
type Word5 = OddWord Word8 (One (Zero (One ())))
type Word6 = OddWord Word8 (One (One (Zero ())))
type Word7 = OddWord Word8 (One (One (One ())))
type Word9 = OddWord Word16 (One (Zero (Zero (One ()))))
type Word10 = OddWord Word16 (One (Zero (One (Zero ()))))
type Word11 = OddWord Word16 (One (Zero (One (One ()))))
type Word12 = OddWord Word16 (One (One (Zero (Zero ()))))
type Word13 = OddWord Word16 (One (One (Zero (One ()))))
type Word14 = OddWord Word16 (One (One (One (Zero ()))))
type Word15 = OddWord Word16 (One (One (One (One ()))))
type Word17 = OddWord Word32 (One (Zero (Zero (Zero (One ())))))
type Word18 = OddWord Word32 (One (Zero (Zero (One (Zero ())))))
type Word19 = OddWord Word32 (One (Zero (Zero (One (One ())))))
type Word20 = OddWord Word32 (One (Zero (One (Zero (Zero ())))))
type Word21 = OddWord Word32 (One (Zero (One (Zero (One ())))))
type Word22 = OddWord Word32 (One (Zero (One (One (Zero ())))))
type Word23 = OddWord Word32 (One (Zero (One (One (One ())))))
type Word24 = OddWord Word32 (One (One (Zero (Zero (Zero ())))))
type Word25 = OddWord Word32 (One (One (Zero (Zero (One ())))))
type Word26 = OddWord Word32 (One (One (Zero (One (Zero ())))))
type Word27 = OddWord Word32 (One (One (Zero (One (One ())))))
type Word28 = OddWord Word32 (One (One (One (Zero (Zero ())))))
type Word29 = OddWord Word32 (One (One (One (Zero (One ())))))
type Word30 = OddWord Word32 (One (One (One (One (Zero ())))))
type Word31 = OddWord Word32 (One (One (One (One (One ())))))
type Word33 = OddWord Word64 (One (Zero (Zero (Zero (Zero (One ()))))))
type Word34 = OddWord Word64 (One (Zero (Zero (Zero (One (Zero ()))))))
type Word35 = OddWord Word64 (One (Zero (Zero (Zero (One (One ()))))))
type Word36 = OddWord Word64 (One (Zero (Zero (One (Zero (Zero ()))))))
type Word37 = OddWord Word64 (One (Zero (Zero (One (Zero (One ()))))))
type Word38 = OddWord Word64 (One (Zero (Zero (One (One (Zero ()))))))
type Word39 = OddWord Word64 (One (Zero (Zero (One (One (One ()))))))
type Word40 = OddWord Word64 (One (Zero (One (Zero (Zero (Zero ()))))))
type Word41 = OddWord Word64 (One (Zero (One (Zero (Zero (One ()))))))
type Word42 = OddWord Word64 (One (Zero (One (Zero (One (Zero ()))))))
type Word43 = OddWord Word64 (One (Zero (One (Zero (One (One ()))))))
type Word44 = OddWord Word64 (One (Zero (One (One (Zero (Zero ()))))))
type Word45 = OddWord Word64 (One (Zero (One (One (Zero (One ()))))))
type Word46 = OddWord Word64 (One (Zero (One (One (One (Zero ()))))))
type Word47 = OddWord Word64 (One (Zero (One (One (One (One ()))))))
type Word48 = OddWord Word64 (One (One (Zero (Zero (Zero (Zero ()))))))
type Word49 = OddWord Word64 (One (One (Zero (Zero (Zero (One ()))))))
type Word50 = OddWord Word64 (One (One (Zero (Zero (One (Zero ()))))))
type Word51 = OddWord Word64 (One (One (Zero (Zero (One (One ()))))))
type Word52 = OddWord Word64 (One (One (Zero (One (Zero (Zero ()))))))
type Word53 = OddWord Word64 (One (One (Zero (One (Zero (One ()))))))
type Word54 = OddWord Word64 (One (One (Zero (One (One (Zero ()))))))
type Word55 = OddWord Word64 (One (One (Zero (One (One (One ()))))))
type Word56 = OddWord Word64 (One (One (One (Zero (Zero (Zero ()))))))
type Word57 = OddWord Word64 (One (One (One (Zero (Zero (One ()))))))
type Word58 = OddWord Word64 (One (One (One (Zero (One (Zero ()))))))
type Word59 = OddWord Word64 (One (One (One (Zero (One (One ()))))))
type Word60 = OddWord Word64 (One (One (One (One (Zero (Zero ()))))))
type Word61 = OddWord Word64 (One (One (One (One (Zero (One ()))))))
type Word62 = OddWord Word64 (One (One (One (One (One (Zero ()))))))
type Word63 = OddWord Word64 (One (One (One (One (One (One ()))))))
instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Word.Odd.OddWord a n)
instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Word.Odd.OddWord a n)
instance Data.Word.Odd.FiniteBitsBase GHC.Word.Word8
instance Data.Word.Odd.FiniteBitsBase GHC.Word.Word16
instance Data.Word.Odd.FiniteBitsBase GHC.Word.Word32
instance Data.Word.Odd.FiniteBitsBase GHC.Word.Word64
instance Data.Word.Odd.FiniteBitsBase GHC.Integer.Type.Integer
instance (GHC.Num.Num a, Data.Word.Odd.FiniteBitsBase a, Data.Word.Odd.TypeNum n) => Data.Bits.FiniteBits (Data.Word.Odd.OddWord a n)
instance Data.Word.Odd.ZNatValue 'Data.Word.Odd.IsZ
instance Data.Word.Odd.ZNatValue (Data.Word.Odd.ToZNat (GHC.TypeNats.Div n 2)) => Data.Word.Odd.ZNatValue ('Data.Word.Odd.NonZE n)
instance Data.Word.Odd.ZNatValue (Data.Word.Odd.ToZNat (GHC.TypeNats.Div n 2)) => Data.Word.Odd.ZNatValue ('Data.Word.Odd.NonZO n)
instance Data.Word.Odd.ZNatValue (Data.Word.Odd.ToZNat n) => Data.Word.Odd.TypeNum (Data.Word.Odd.Lit n)
instance Data.Word.Odd.TypeNum a => Data.Word.Odd.TypeNum (Data.Word.Odd.Zero a)
instance Data.Word.Odd.TypeNum a => Data.Word.Odd.TypeNum (Data.Word.Odd.One a)
instance Data.Word.Odd.TypeNum ()
instance (GHC.Read.Read a, GHC.Num.Num a, Data.Bits.Bits a, Data.Word.Odd.TypeNum n) => GHC.Read.Read (Data.Word.Odd.OddWord a n)
instance (GHC.Num.Num a, Data.Bits.Bits a, Data.Word.Odd.TypeNum n) => GHC.Num.Num (Data.Word.Odd.OddWord a n)
instance (GHC.Real.Real a, Data.Bits.Bits a, Data.Word.Odd.TypeNum n) => GHC.Real.Real (Data.Word.Odd.OddWord a n)
instance (GHC.Num.Num a, Data.Bits.Bits a, Data.Word.Odd.TypeNum n) => GHC.Enum.Bounded (Data.Word.Odd.OddWord a n)
instance (GHC.Enum.Enum a, GHC.Classes.Ord a, GHC.Num.Num a, Data.Bits.Bits a, Data.Word.Odd.TypeNum n) => GHC.Enum.Enum (Data.Word.Odd.OddWord a n)
instance (GHC.Real.Integral a, Data.Bits.Bits a, Data.Word.Odd.TypeNum n) => GHC.Real.Integral (Data.Word.Odd.OddWord a n)
instance (GHC.Num.Num a, Data.Bits.Bits a, Data.Word.Odd.TypeNum n) => Data.Bits.Bits (Data.Word.Odd.OddWord a n)
instance GHC.Show.Show a => GHC.Show.Show (Data.Word.Odd.OddWord a n)
