adaptive-containers (empty) → 0.1
raw patch · 6 files changed
+1524/−0 lines, 6 filesdep +basesetup-changed
Dependencies added: base
Files
- Data/Adaptive/Tuple.hs +1327/−0
- LICENSE +29/−0
- Setup.lhs +3/−0
- adaptive-containers.cabal +36/−0
- scripts/derive.hs +115/−0
- scripts/size.hs +14/−0
+ Data/Adaptive/Tuple.hs view
@@ -0,0 +1,1327 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, OverlappingInstances #-}++-- |+-- Module : Data.Adaptive.Tuple+-- Copyright : (c) Don Stewart 2009+-- License : BSD-style+-- Maintainer : dons@galois.com+-- Stability : experimental+-- +-- Self optimzing pair types.+--+-- This library statically adapts the polymorphic container+-- representation of tuples to specific, more efficient representations,+-- when instantiated with particular monomorphic types. It does this via+-- an associated more efficient data type for each pair of elements you+-- wish to store in your container.+--+-- That is, instead of representing '(Int,Char)' as:+--+-- > (,)+-- > / \+-- > I# 3# C# x#+--+-- A self-optimizing pair will unpack the constructors, yielding this+-- data representation:+--+-- > PairIntChar 3# x#+--+-- Saving two indirections. The resulting structure should be both more+-- time and space efficient than the generic polymorphic container it is+-- derived from. For example, adaptive pairs use 8 bytes to store an Int and+-- Char pair, while a lazy pair uses 24 bytes.+--+-- > > Prelude Size> unsafeSizeof ((42, 'x') :: (Int,Char))+-- > > 24+--+-- > Prelude Size> unsafeSizeof (pair 42 'x' :: Pair Int Char)+-- > > 8+--+-- You can inspect the size and layout of your adaptive structures using two scripts, +-- one for measuring the size of a closure, described in+-- <http://ghcmutterings.wordpress.com/2009/02/>, and vacuum-cairo, for rendering +-- the heap structure explicitly+-- <http://hackage.haskell.org/cgi-bin/hackage-scripts/package/vacuum-cairo>+--+-- Types that instantiate the 'Adapt' class will self-adapt this way.+--+-- Self adaptive polymorphic containers are able to unpack their+-- components, something not possible with, for example, strict+-- polymorphic containers.+--++module Data.Adaptive.Tuple where++import Prelude hiding (curry, uncurry, fst, snd)+import qualified Prelude++import Data.Int+import Data.Word++--+-- | Representation-improving polymorphic tuples.+--+class Adapt a b where++ data Pair a b++ -- | Extract the first component of a pair.+ fst :: Pair a b -> a++ -- | Extract the second component of a pair.+ snd :: Pair a b -> b++ -- | 'curry' converts an uncurried function to a curried function.+ curry :: (Pair a b -> c) -> a -> b -> c++------------------------------------------------------------------------++-- | Construct a new pair.+pair :: Adapt a b => a -> b -> Pair a b+pair = curry id++-- | 'uncurry' converts a curried function to a function on pairs.+uncurry :: Adapt a b => (a -> b -> c) -> (Pair a b -> c)+uncurry f p = f (fst p) (snd p)++-- | Convert an adaptive pair to a regular polymorphic tuple+fromPair :: Adapt a b => Pair a b -> (a, b)+fromPair = uncurry (,)++-- | Convert a regular polymorphic tuple to an adaptive pair+toPair :: Adapt a b => (a,b) -> Pair a b+toPair (a,b) = pair a b++------------------------------------------------------------------------+-- Methods++-- standalone deriving crashes here: do not attempt it.+-- deriving instance (Eq a, Eq b, Adapt a b) => Eq (Pair a b)+-- deriving instance (Ord a, Ord b, Adapt a b) => Ord (Pair a b)+-- deriving instance (Show a, Show b, Adapt a b) => Show (Pair a b)++instance (Bounded a, Bounded b, Adapt a b) => Bounded (Pair a b) where+ minBound = pair minBound minBound+ maxBound = pair maxBound maxBound++instance (Eq a, Eq b, Adapt a b) => Eq (Pair a b) where+ p == q = fst p == fst q && snd p == snd q++instance (Ord a, Ord b, Adapt a b) => Ord (Pair a b) where+ compare p q =+ compare (fst p) (fst q)+ `compare`+ compare (snd p) (snd q)++instance (Show a, Show b, Adapt a b) => Show (Pair a b) where+ show p = "Pair " ++ show (fst p) ++ " "++ show (snd p)++------------------------------------------------------------------------+--+-- Generic instance of pairs in terms of (,)+--+++instance Adapt a b where+ newtype Pair a b = PairPair { unPair :: (,) a b }++ fst = Prelude.fst . unPair+ snd = Prelude.snd . unPair+ curry f x y = f (PairPair (x,y))++------------------------------------------------------------------------+--+-- Hand written instances:+--++instance Adapt () () where+ data Pair () () = PUnit++ fst PUnit = ()+ snd PUnit = ()+ curry f _ _ = f PUnit++-- TODO: sums: Bool+-- TODO: products: pairs++------------------------------------------------------------------------+--+-- Generated by scripts/derive.hs+--++instance Adapt Int Int where+ data Pair Int Int = PairIntInt {-# UNPACK #-}!Int {-# UNPACK #-}!Int+ fst (PairIntInt a _) = a+ snd (PairIntInt _ b) = b+ curry f x y = f (PairIntInt x y)++instance Adapt Int Integer where+ data Pair Int Integer = PairIntInteger {-# UNPACK #-}!Int {-# UNPACK #-}!Integer+ fst (PairIntInteger a _) = a+ snd (PairIntInteger _ b) = b+ curry f x y = f (PairIntInteger x y)++instance Adapt Int Int8 where+ data Pair Int Int8 = PairIntInt8 {-# UNPACK #-}!Int {-# UNPACK #-}!Int8+ fst (PairIntInt8 a _) = a+ snd (PairIntInt8 _ b) = b+ curry f x y = f (PairIntInt8 x y)++instance Adapt Int Int16 where+ data Pair Int Int16 = PairIntInt16 {-# UNPACK #-}!Int {-# UNPACK #-}!Int16+ fst (PairIntInt16 a _) = a+ snd (PairIntInt16 _ b) = b+ curry f x y = f (PairIntInt16 x y)++instance Adapt Int Int32 where+ data Pair Int Int32 = PairIntInt32 {-# UNPACK #-}!Int {-# UNPACK #-}!Int32+ fst (PairIntInt32 a _) = a+ snd (PairIntInt32 _ b) = b+ curry f x y = f (PairIntInt32 x y)++instance Adapt Int Int64 where+ data Pair Int Int64 = PairIntInt64 {-# UNPACK #-}!Int {-# UNPACK #-}!Int64+ fst (PairIntInt64 a _) = a+ snd (PairIntInt64 _ b) = b+ curry f x y = f (PairIntInt64 x y)++instance Adapt Int Word where+ data Pair Int Word = PairIntWord {-# UNPACK #-}!Int {-# UNPACK #-}!Word+ fst (PairIntWord a _) = a+ snd (PairIntWord _ b) = b+ curry f x y = f (PairIntWord x y)++instance Adapt Int Word8 where+ data Pair Int Word8 = PairIntWord8 {-# UNPACK #-}!Int {-# UNPACK #-}!Word8+ fst (PairIntWord8 a _) = a+ snd (PairIntWord8 _ b) = b+ curry f x y = f (PairIntWord8 x y)++instance Adapt Int Word16 where+ data Pair Int Word16 = PairIntWord16 {-# UNPACK #-}!Int {-# UNPACK #-}!Word16+ fst (PairIntWord16 a _) = a+ snd (PairIntWord16 _ b) = b+ curry f x y = f (PairIntWord16 x y)++instance Adapt Int Word32 where+ data Pair Int Word32 = PairIntWord32 {-# UNPACK #-}!Int {-# UNPACK #-}!Word32+ fst (PairIntWord32 a _) = a+ snd (PairIntWord32 _ b) = b+ curry f x y = f (PairIntWord32 x y)++instance Adapt Int Word64 where+ data Pair Int Word64 = PairIntWord64 {-# UNPACK #-}!Int {-# UNPACK #-}!Word64+ fst (PairIntWord64 a _) = a+ snd (PairIntWord64 _ b) = b+ curry f x y = f (PairIntWord64 x y)++instance Adapt Int Double where+ data Pair Int Double = PairIntDouble {-# UNPACK #-}!Int {-# UNPACK #-}!Double+ fst (PairIntDouble a _) = a+ snd (PairIntDouble _ b) = b+ curry f x y = f (PairIntDouble x y)++instance Adapt Int Float where+ data Pair Int Float = PairIntFloat {-# UNPACK #-}!Int {-# UNPACK #-}!Float+ fst (PairIntFloat a _) = a+ snd (PairIntFloat _ b) = b+ curry f x y = f (PairIntFloat x y)++instance Adapt Int Char where+ data Pair Int Char = PairIntChar {-# UNPACK #-}!Int {-# UNPACK #-}!Char+ fst (PairIntChar a _) = a+ snd (PairIntChar _ b) = b+ curry f x y = f (PairIntChar x y)++instance Adapt Integer Int where+ data Pair Integer Int = PairIntegerInt {-# UNPACK #-}!Integer {-# UNPACK #-}!Int+ fst (PairIntegerInt a _) = a+ snd (PairIntegerInt _ b) = b+ curry f x y = f (PairIntegerInt x y)++instance Adapt Integer Integer where+ data Pair Integer Integer = PairIntegerInteger {-# UNPACK #-}!Integer {-# UNPACK #-}!Integer+ fst (PairIntegerInteger a _) = a+ snd (PairIntegerInteger _ b) = b+ curry f x y = f (PairIntegerInteger x y)++instance Adapt Integer Int8 where+ data Pair Integer Int8 = PairIntegerInt8 {-# UNPACK #-}!Integer {-# UNPACK #-}!Int8+ fst (PairIntegerInt8 a _) = a+ snd (PairIntegerInt8 _ b) = b+ curry f x y = f (PairIntegerInt8 x y)++instance Adapt Integer Int16 where+ data Pair Integer Int16 = PairIntegerInt16 {-# UNPACK #-}!Integer {-# UNPACK #-}!Int16+ fst (PairIntegerInt16 a _) = a+ snd (PairIntegerInt16 _ b) = b+ curry f x y = f (PairIntegerInt16 x y)++instance Adapt Integer Int32 where+ data Pair Integer Int32 = PairIntegerInt32 {-# UNPACK #-}!Integer {-# UNPACK #-}!Int32+ fst (PairIntegerInt32 a _) = a+ snd (PairIntegerInt32 _ b) = b+ curry f x y = f (PairIntegerInt32 x y)++instance Adapt Integer Int64 where+ data Pair Integer Int64 = PairIntegerInt64 {-# UNPACK #-}!Integer {-# UNPACK #-}!Int64+ fst (PairIntegerInt64 a _) = a+ snd (PairIntegerInt64 _ b) = b+ curry f x y = f (PairIntegerInt64 x y)++instance Adapt Integer Word where+ data Pair Integer Word = PairIntegerWord {-# UNPACK #-}!Integer {-# UNPACK #-}!Word+ fst (PairIntegerWord a _) = a+ snd (PairIntegerWord _ b) = b+ curry f x y = f (PairIntegerWord x y)++instance Adapt Integer Word8 where+ data Pair Integer Word8 = PairIntegerWord8 {-# UNPACK #-}!Integer {-# UNPACK #-}!Word8+ fst (PairIntegerWord8 a _) = a+ snd (PairIntegerWord8 _ b) = b+ curry f x y = f (PairIntegerWord8 x y)++instance Adapt Integer Word16 where+ data Pair Integer Word16 = PairIntegerWord16 {-# UNPACK #-}!Integer {-# UNPACK #-}!Word16+ fst (PairIntegerWord16 a _) = a+ snd (PairIntegerWord16 _ b) = b+ curry f x y = f (PairIntegerWord16 x y)++instance Adapt Integer Word32 where+ data Pair Integer Word32 = PairIntegerWord32 {-# UNPACK #-}!Integer {-# UNPACK #-}!Word32+ fst (PairIntegerWord32 a _) = a+ snd (PairIntegerWord32 _ b) = b+ curry f x y = f (PairIntegerWord32 x y)++instance Adapt Integer Word64 where+ data Pair Integer Word64 = PairIntegerWord64 {-# UNPACK #-}!Integer {-# UNPACK #-}!Word64+ fst (PairIntegerWord64 a _) = a+ snd (PairIntegerWord64 _ b) = b+ curry f x y = f (PairIntegerWord64 x y)++instance Adapt Integer Double where+ data Pair Integer Double = PairIntegerDouble {-# UNPACK #-}!Integer {-# UNPACK #-}!Double+ fst (PairIntegerDouble a _) = a+ snd (PairIntegerDouble _ b) = b+ curry f x y = f (PairIntegerDouble x y)++instance Adapt Integer Float where+ data Pair Integer Float = PairIntegerFloat {-# UNPACK #-}!Integer {-# UNPACK #-}!Float+ fst (PairIntegerFloat a _) = a+ snd (PairIntegerFloat _ b) = b+ curry f x y = f (PairIntegerFloat x y)++instance Adapt Integer Char where+ data Pair Integer Char = PairIntegerChar {-# UNPACK #-}!Integer {-# UNPACK #-}!Char+ fst (PairIntegerChar a _) = a+ snd (PairIntegerChar _ b) = b+ curry f x y = f (PairIntegerChar x y)++instance Adapt Int8 Int where+ data Pair Int8 Int = PairInt8Int {-# UNPACK #-}!Int8 {-# UNPACK #-}!Int+ fst (PairInt8Int a _) = a+ snd (PairInt8Int _ b) = b+ curry f x y = f (PairInt8Int x y)++instance Adapt Int8 Integer where+ data Pair Int8 Integer = PairInt8Integer {-# UNPACK #-}!Int8 {-# UNPACK #-}!Integer+ fst (PairInt8Integer a _) = a+ snd (PairInt8Integer _ b) = b+ curry f x y = f (PairInt8Integer x y)++instance Adapt Int8 Int8 where+ data Pair Int8 Int8 = PairInt8Int8 {-# UNPACK #-}!Int8 {-# UNPACK #-}!Int8+ fst (PairInt8Int8 a _) = a+ snd (PairInt8Int8 _ b) = b+ curry f x y = f (PairInt8Int8 x y)++instance Adapt Int8 Int16 where+ data Pair Int8 Int16 = PairInt8Int16 {-# UNPACK #-}!Int8 {-# UNPACK #-}!Int16+ fst (PairInt8Int16 a _) = a+ snd (PairInt8Int16 _ b) = b+ curry f x y = f (PairInt8Int16 x y)++instance Adapt Int8 Int32 where+ data Pair Int8 Int32 = PairInt8Int32 {-# UNPACK #-}!Int8 {-# UNPACK #-}!Int32+ fst (PairInt8Int32 a _) = a+ snd (PairInt8Int32 _ b) = b+ curry f x y = f (PairInt8Int32 x y)++instance Adapt Int8 Int64 where+ data Pair Int8 Int64 = PairInt8Int64 {-# UNPACK #-}!Int8 {-# UNPACK #-}!Int64+ fst (PairInt8Int64 a _) = a+ snd (PairInt8Int64 _ b) = b+ curry f x y = f (PairInt8Int64 x y)++instance Adapt Int8 Word where+ data Pair Int8 Word = PairInt8Word {-# UNPACK #-}!Int8 {-# UNPACK #-}!Word+ fst (PairInt8Word a _) = a+ snd (PairInt8Word _ b) = b+ curry f x y = f (PairInt8Word x y)++instance Adapt Int8 Word8 where+ data Pair Int8 Word8 = PairInt8Word8 {-# UNPACK #-}!Int8 {-# UNPACK #-}!Word8+ fst (PairInt8Word8 a _) = a+ snd (PairInt8Word8 _ b) = b+ curry f x y = f (PairInt8Word8 x y)++instance Adapt Int8 Word16 where+ data Pair Int8 Word16 = PairInt8Word16 {-# UNPACK #-}!Int8 {-# UNPACK #-}!Word16+ fst (PairInt8Word16 a _) = a+ snd (PairInt8Word16 _ b) = b+ curry f x y = f (PairInt8Word16 x y)++instance Adapt Int8 Word32 where+ data Pair Int8 Word32 = PairInt8Word32 {-# UNPACK #-}!Int8 {-# UNPACK #-}!Word32+ fst (PairInt8Word32 a _) = a+ snd (PairInt8Word32 _ b) = b+ curry f x y = f (PairInt8Word32 x y)++instance Adapt Int8 Word64 where+ data Pair Int8 Word64 = PairInt8Word64 {-# UNPACK #-}!Int8 {-# UNPACK #-}!Word64+ fst (PairInt8Word64 a _) = a+ snd (PairInt8Word64 _ b) = b+ curry f x y = f (PairInt8Word64 x y)++instance Adapt Int8 Double where+ data Pair Int8 Double = PairInt8Double {-# UNPACK #-}!Int8 {-# UNPACK #-}!Double+ fst (PairInt8Double a _) = a+ snd (PairInt8Double _ b) = b+ curry f x y = f (PairInt8Double x y)++instance Adapt Int8 Float where+ data Pair Int8 Float = PairInt8Float {-# UNPACK #-}!Int8 {-# UNPACK #-}!Float+ fst (PairInt8Float a _) = a+ snd (PairInt8Float _ b) = b+ curry f x y = f (PairInt8Float x y)++instance Adapt Int8 Char where+ data Pair Int8 Char = PairInt8Char {-# UNPACK #-}!Int8 {-# UNPACK #-}!Char+ fst (PairInt8Char a _) = a+ snd (PairInt8Char _ b) = b+ curry f x y = f (PairInt8Char x y)++instance Adapt Int16 Int where+ data Pair Int16 Int = PairInt16Int {-# UNPACK #-}!Int16 {-# UNPACK #-}!Int+ fst (PairInt16Int a _) = a+ snd (PairInt16Int _ b) = b+ curry f x y = f (PairInt16Int x y)++instance Adapt Int16 Integer where+ data Pair Int16 Integer = PairInt16Integer {-# UNPACK #-}!Int16 {-# UNPACK #-}!Integer+ fst (PairInt16Integer a _) = a+ snd (PairInt16Integer _ b) = b+ curry f x y = f (PairInt16Integer x y)++instance Adapt Int16 Int8 where+ data Pair Int16 Int8 = PairInt16Int8 {-# UNPACK #-}!Int16 {-# UNPACK #-}!Int8+ fst (PairInt16Int8 a _) = a+ snd (PairInt16Int8 _ b) = b+ curry f x y = f (PairInt16Int8 x y)++instance Adapt Int16 Int16 where+ data Pair Int16 Int16 = PairInt16Int16 {-# UNPACK #-}!Int16 {-# UNPACK #-}!Int16+ fst (PairInt16Int16 a _) = a+ snd (PairInt16Int16 _ b) = b+ curry f x y = f (PairInt16Int16 x y)++instance Adapt Int16 Int32 where+ data Pair Int16 Int32 = PairInt16Int32 {-# UNPACK #-}!Int16 {-# UNPACK #-}!Int32+ fst (PairInt16Int32 a _) = a+ snd (PairInt16Int32 _ b) = b+ curry f x y = f (PairInt16Int32 x y)++instance Adapt Int16 Int64 where+ data Pair Int16 Int64 = PairInt16Int64 {-# UNPACK #-}!Int16 {-# UNPACK #-}!Int64+ fst (PairInt16Int64 a _) = a+ snd (PairInt16Int64 _ b) = b+ curry f x y = f (PairInt16Int64 x y)++instance Adapt Int16 Word where+ data Pair Int16 Word = PairInt16Word {-# UNPACK #-}!Int16 {-# UNPACK #-}!Word+ fst (PairInt16Word a _) = a+ snd (PairInt16Word _ b) = b+ curry f x y = f (PairInt16Word x y)++instance Adapt Int16 Word8 where+ data Pair Int16 Word8 = PairInt16Word8 {-# UNPACK #-}!Int16 {-# UNPACK #-}!Word8+ fst (PairInt16Word8 a _) = a+ snd (PairInt16Word8 _ b) = b+ curry f x y = f (PairInt16Word8 x y)++instance Adapt Int16 Word16 where+ data Pair Int16 Word16 = PairInt16Word16 {-# UNPACK #-}!Int16 {-# UNPACK #-}!Word16+ fst (PairInt16Word16 a _) = a+ snd (PairInt16Word16 _ b) = b+ curry f x y = f (PairInt16Word16 x y)++instance Adapt Int16 Word32 where+ data Pair Int16 Word32 = PairInt16Word32 {-# UNPACK #-}!Int16 {-# UNPACK #-}!Word32+ fst (PairInt16Word32 a _) = a+ snd (PairInt16Word32 _ b) = b+ curry f x y = f (PairInt16Word32 x y)++instance Adapt Int16 Word64 where+ data Pair Int16 Word64 = PairInt16Word64 {-# UNPACK #-}!Int16 {-# UNPACK #-}!Word64+ fst (PairInt16Word64 a _) = a+ snd (PairInt16Word64 _ b) = b+ curry f x y = f (PairInt16Word64 x y)++instance Adapt Int16 Double where+ data Pair Int16 Double = PairInt16Double {-# UNPACK #-}!Int16 {-# UNPACK #-}!Double+ fst (PairInt16Double a _) = a+ snd (PairInt16Double _ b) = b+ curry f x y = f (PairInt16Double x y)++instance Adapt Int16 Float where+ data Pair Int16 Float = PairInt16Float {-# UNPACK #-}!Int16 {-# UNPACK #-}!Float+ fst (PairInt16Float a _) = a+ snd (PairInt16Float _ b) = b+ curry f x y = f (PairInt16Float x y)++instance Adapt Int16 Char where+ data Pair Int16 Char = PairInt16Char {-# UNPACK #-}!Int16 {-# UNPACK #-}!Char+ fst (PairInt16Char a _) = a+ snd (PairInt16Char _ b) = b+ curry f x y = f (PairInt16Char x y)++instance Adapt Int32 Int where+ data Pair Int32 Int = PairInt32Int {-# UNPACK #-}!Int32 {-# UNPACK #-}!Int+ fst (PairInt32Int a _) = a+ snd (PairInt32Int _ b) = b+ curry f x y = f (PairInt32Int x y)++instance Adapt Int32 Integer where+ data Pair Int32 Integer = PairInt32Integer {-# UNPACK #-}!Int32 {-# UNPACK #-}!Integer+ fst (PairInt32Integer a _) = a+ snd (PairInt32Integer _ b) = b+ curry f x y = f (PairInt32Integer x y)++instance Adapt Int32 Int8 where+ data Pair Int32 Int8 = PairInt32Int8 {-# UNPACK #-}!Int32 {-# UNPACK #-}!Int8+ fst (PairInt32Int8 a _) = a+ snd (PairInt32Int8 _ b) = b+ curry f x y = f (PairInt32Int8 x y)++instance Adapt Int32 Int16 where+ data Pair Int32 Int16 = PairInt32Int16 {-# UNPACK #-}!Int32 {-# UNPACK #-}!Int16+ fst (PairInt32Int16 a _) = a+ snd (PairInt32Int16 _ b) = b+ curry f x y = f (PairInt32Int16 x y)++instance Adapt Int32 Int32 where+ data Pair Int32 Int32 = PairInt32Int32 {-# UNPACK #-}!Int32 {-# UNPACK #-}!Int32+ fst (PairInt32Int32 a _) = a+ snd (PairInt32Int32 _ b) = b+ curry f x y = f (PairInt32Int32 x y)++instance Adapt Int32 Int64 where+ data Pair Int32 Int64 = PairInt32Int64 {-# UNPACK #-}!Int32 {-# UNPACK #-}!Int64+ fst (PairInt32Int64 a _) = a+ snd (PairInt32Int64 _ b) = b+ curry f x y = f (PairInt32Int64 x y)++instance Adapt Int32 Word where+ data Pair Int32 Word = PairInt32Word {-# UNPACK #-}!Int32 {-# UNPACK #-}!Word+ fst (PairInt32Word a _) = a+ snd (PairInt32Word _ b) = b+ curry f x y = f (PairInt32Word x y)++instance Adapt Int32 Word8 where+ data Pair Int32 Word8 = PairInt32Word8 {-# UNPACK #-}!Int32 {-# UNPACK #-}!Word8+ fst (PairInt32Word8 a _) = a+ snd (PairInt32Word8 _ b) = b+ curry f x y = f (PairInt32Word8 x y)++instance Adapt Int32 Word16 where+ data Pair Int32 Word16 = PairInt32Word16 {-# UNPACK #-}!Int32 {-# UNPACK #-}!Word16+ fst (PairInt32Word16 a _) = a+ snd (PairInt32Word16 _ b) = b+ curry f x y = f (PairInt32Word16 x y)++instance Adapt Int32 Word32 where+ data Pair Int32 Word32 = PairInt32Word32 {-# UNPACK #-}!Int32 {-# UNPACK #-}!Word32+ fst (PairInt32Word32 a _) = a+ snd (PairInt32Word32 _ b) = b+ curry f x y = f (PairInt32Word32 x y)++instance Adapt Int32 Word64 where+ data Pair Int32 Word64 = PairInt32Word64 {-# UNPACK #-}!Int32 {-# UNPACK #-}!Word64+ fst (PairInt32Word64 a _) = a+ snd (PairInt32Word64 _ b) = b+ curry f x y = f (PairInt32Word64 x y)++instance Adapt Int32 Double where+ data Pair Int32 Double = PairInt32Double {-# UNPACK #-}!Int32 {-# UNPACK #-}!Double+ fst (PairInt32Double a _) = a+ snd (PairInt32Double _ b) = b+ curry f x y = f (PairInt32Double x y)++instance Adapt Int32 Float where+ data Pair Int32 Float = PairInt32Float {-# UNPACK #-}!Int32 {-# UNPACK #-}!Float+ fst (PairInt32Float a _) = a+ snd (PairInt32Float _ b) = b+ curry f x y = f (PairInt32Float x y)++instance Adapt Int32 Char where+ data Pair Int32 Char = PairInt32Char {-# UNPACK #-}!Int32 {-# UNPACK #-}!Char+ fst (PairInt32Char a _) = a+ snd (PairInt32Char _ b) = b+ curry f x y = f (PairInt32Char x y)++instance Adapt Int64 Int where+ data Pair Int64 Int = PairInt64Int {-# UNPACK #-}!Int64 {-# UNPACK #-}!Int+ fst (PairInt64Int a _) = a+ snd (PairInt64Int _ b) = b+ curry f x y = f (PairInt64Int x y)++instance Adapt Int64 Integer where+ data Pair Int64 Integer = PairInt64Integer {-# UNPACK #-}!Int64 {-# UNPACK #-}!Integer+ fst (PairInt64Integer a _) = a+ snd (PairInt64Integer _ b) = b+ curry f x y = f (PairInt64Integer x y)++instance Adapt Int64 Int8 where+ data Pair Int64 Int8 = PairInt64Int8 {-# UNPACK #-}!Int64 {-# UNPACK #-}!Int8+ fst (PairInt64Int8 a _) = a+ snd (PairInt64Int8 _ b) = b+ curry f x y = f (PairInt64Int8 x y)++instance Adapt Int64 Int16 where+ data Pair Int64 Int16 = PairInt64Int16 {-# UNPACK #-}!Int64 {-# UNPACK #-}!Int16+ fst (PairInt64Int16 a _) = a+ snd (PairInt64Int16 _ b) = b+ curry f x y = f (PairInt64Int16 x y)++instance Adapt Int64 Int32 where+ data Pair Int64 Int32 = PairInt64Int32 {-# UNPACK #-}!Int64 {-# UNPACK #-}!Int32+ fst (PairInt64Int32 a _) = a+ snd (PairInt64Int32 _ b) = b+ curry f x y = f (PairInt64Int32 x y)++instance Adapt Int64 Int64 where+ data Pair Int64 Int64 = PairInt64Int64 {-# UNPACK #-}!Int64 {-# UNPACK #-}!Int64+ fst (PairInt64Int64 a _) = a+ snd (PairInt64Int64 _ b) = b+ curry f x y = f (PairInt64Int64 x y)++instance Adapt Int64 Word where+ data Pair Int64 Word = PairInt64Word {-# UNPACK #-}!Int64 {-# UNPACK #-}!Word+ fst (PairInt64Word a _) = a+ snd (PairInt64Word _ b) = b+ curry f x y = f (PairInt64Word x y)++instance Adapt Int64 Word8 where+ data Pair Int64 Word8 = PairInt64Word8 {-# UNPACK #-}!Int64 {-# UNPACK #-}!Word8+ fst (PairInt64Word8 a _) = a+ snd (PairInt64Word8 _ b) = b+ curry f x y = f (PairInt64Word8 x y)++instance Adapt Int64 Word16 where+ data Pair Int64 Word16 = PairInt64Word16 {-# UNPACK #-}!Int64 {-# UNPACK #-}!Word16+ fst (PairInt64Word16 a _) = a+ snd (PairInt64Word16 _ b) = b+ curry f x y = f (PairInt64Word16 x y)++instance Adapt Int64 Word32 where+ data Pair Int64 Word32 = PairInt64Word32 {-# UNPACK #-}!Int64 {-# UNPACK #-}!Word32+ fst (PairInt64Word32 a _) = a+ snd (PairInt64Word32 _ b) = b+ curry f x y = f (PairInt64Word32 x y)++instance Adapt Int64 Word64 where+ data Pair Int64 Word64 = PairInt64Word64 {-# UNPACK #-}!Int64 {-# UNPACK #-}!Word64+ fst (PairInt64Word64 a _) = a+ snd (PairInt64Word64 _ b) = b+ curry f x y = f (PairInt64Word64 x y)++instance Adapt Int64 Double where+ data Pair Int64 Double = PairInt64Double {-# UNPACK #-}!Int64 {-# UNPACK #-}!Double+ fst (PairInt64Double a _) = a+ snd (PairInt64Double _ b) = b+ curry f x y = f (PairInt64Double x y)++instance Adapt Int64 Float where+ data Pair Int64 Float = PairInt64Float {-# UNPACK #-}!Int64 {-# UNPACK #-}!Float+ fst (PairInt64Float a _) = a+ snd (PairInt64Float _ b) = b+ curry f x y = f (PairInt64Float x y)++instance Adapt Int64 Char where+ data Pair Int64 Char = PairInt64Char {-# UNPACK #-}!Int64 {-# UNPACK #-}!Char+ fst (PairInt64Char a _) = a+ snd (PairInt64Char _ b) = b+ curry f x y = f (PairInt64Char x y)++instance Adapt Word Int where+ data Pair Word Int = PairWordInt {-# UNPACK #-}!Word {-# UNPACK #-}!Int+ fst (PairWordInt a _) = a+ snd (PairWordInt _ b) = b+ curry f x y = f (PairWordInt x y)++instance Adapt Word Integer where+ data Pair Word Integer = PairWordInteger {-# UNPACK #-}!Word {-# UNPACK #-}!Integer+ fst (PairWordInteger a _) = a+ snd (PairWordInteger _ b) = b+ curry f x y = f (PairWordInteger x y)++instance Adapt Word Int8 where+ data Pair Word Int8 = PairWordInt8 {-# UNPACK #-}!Word {-# UNPACK #-}!Int8+ fst (PairWordInt8 a _) = a+ snd (PairWordInt8 _ b) = b+ curry f x y = f (PairWordInt8 x y)++instance Adapt Word Int16 where+ data Pair Word Int16 = PairWordInt16 {-# UNPACK #-}!Word {-# UNPACK #-}!Int16+ fst (PairWordInt16 a _) = a+ snd (PairWordInt16 _ b) = b+ curry f x y = f (PairWordInt16 x y)++instance Adapt Word Int32 where+ data Pair Word Int32 = PairWordInt32 {-# UNPACK #-}!Word {-# UNPACK #-}!Int32+ fst (PairWordInt32 a _) = a+ snd (PairWordInt32 _ b) = b+ curry f x y = f (PairWordInt32 x y)++instance Adapt Word Int64 where+ data Pair Word Int64 = PairWordInt64 {-# UNPACK #-}!Word {-# UNPACK #-}!Int64+ fst (PairWordInt64 a _) = a+ snd (PairWordInt64 _ b) = b+ curry f x y = f (PairWordInt64 x y)++instance Adapt Word Word where+ data Pair Word Word = PairWordWord {-# UNPACK #-}!Word {-# UNPACK #-}!Word+ fst (PairWordWord a _) = a+ snd (PairWordWord _ b) = b+ curry f x y = f (PairWordWord x y)++instance Adapt Word Word8 where+ data Pair Word Word8 = PairWordWord8 {-# UNPACK #-}!Word {-# UNPACK #-}!Word8+ fst (PairWordWord8 a _) = a+ snd (PairWordWord8 _ b) = b+ curry f x y = f (PairWordWord8 x y)++instance Adapt Word Word16 where+ data Pair Word Word16 = PairWordWord16 {-# UNPACK #-}!Word {-# UNPACK #-}!Word16+ fst (PairWordWord16 a _) = a+ snd (PairWordWord16 _ b) = b+ curry f x y = f (PairWordWord16 x y)++instance Adapt Word Word32 where+ data Pair Word Word32 = PairWordWord32 {-# UNPACK #-}!Word {-# UNPACK #-}!Word32+ fst (PairWordWord32 a _) = a+ snd (PairWordWord32 _ b) = b+ curry f x y = f (PairWordWord32 x y)++instance Adapt Word Word64 where+ data Pair Word Word64 = PairWordWord64 {-# UNPACK #-}!Word {-# UNPACK #-}!Word64+ fst (PairWordWord64 a _) = a+ snd (PairWordWord64 _ b) = b+ curry f x y = f (PairWordWord64 x y)++instance Adapt Word Double where+ data Pair Word Double = PairWordDouble {-# UNPACK #-}!Word {-# UNPACK #-}!Double+ fst (PairWordDouble a _) = a+ snd (PairWordDouble _ b) = b+ curry f x y = f (PairWordDouble x y)++instance Adapt Word Float where+ data Pair Word Float = PairWordFloat {-# UNPACK #-}!Word {-# UNPACK #-}!Float+ fst (PairWordFloat a _) = a+ snd (PairWordFloat _ b) = b+ curry f x y = f (PairWordFloat x y)++instance Adapt Word Char where+ data Pair Word Char = PairWordChar {-# UNPACK #-}!Word {-# UNPACK #-}!Char+ fst (PairWordChar a _) = a+ snd (PairWordChar _ b) = b+ curry f x y = f (PairWordChar x y)++instance Adapt Word8 Int where+ data Pair Word8 Int = PairWord8Int {-# UNPACK #-}!Word8 {-# UNPACK #-}!Int+ fst (PairWord8Int a _) = a+ snd (PairWord8Int _ b) = b+ curry f x y = f (PairWord8Int x y)++instance Adapt Word8 Integer where+ data Pair Word8 Integer = PairWord8Integer {-# UNPACK #-}!Word8 {-# UNPACK #-}!Integer+ fst (PairWord8Integer a _) = a+ snd (PairWord8Integer _ b) = b+ curry f x y = f (PairWord8Integer x y)++instance Adapt Word8 Int8 where+ data Pair Word8 Int8 = PairWord8Int8 {-# UNPACK #-}!Word8 {-# UNPACK #-}!Int8+ fst (PairWord8Int8 a _) = a+ snd (PairWord8Int8 _ b) = b+ curry f x y = f (PairWord8Int8 x y)++instance Adapt Word8 Int16 where+ data Pair Word8 Int16 = PairWord8Int16 {-# UNPACK #-}!Word8 {-# UNPACK #-}!Int16+ fst (PairWord8Int16 a _) = a+ snd (PairWord8Int16 _ b) = b+ curry f x y = f (PairWord8Int16 x y)++instance Adapt Word8 Int32 where+ data Pair Word8 Int32 = PairWord8Int32 {-# UNPACK #-}!Word8 {-# UNPACK #-}!Int32+ fst (PairWord8Int32 a _) = a+ snd (PairWord8Int32 _ b) = b+ curry f x y = f (PairWord8Int32 x y)++instance Adapt Word8 Int64 where+ data Pair Word8 Int64 = PairWord8Int64 {-# UNPACK #-}!Word8 {-# UNPACK #-}!Int64+ fst (PairWord8Int64 a _) = a+ snd (PairWord8Int64 _ b) = b+ curry f x y = f (PairWord8Int64 x y)++instance Adapt Word8 Word where+ data Pair Word8 Word = PairWord8Word {-# UNPACK #-}!Word8 {-# UNPACK #-}!Word+ fst (PairWord8Word a _) = a+ snd (PairWord8Word _ b) = b+ curry f x y = f (PairWord8Word x y)++instance Adapt Word8 Word8 where+ data Pair Word8 Word8 = PairWord8Word8 {-# UNPACK #-}!Word8 {-# UNPACK #-}!Word8+ fst (PairWord8Word8 a _) = a+ snd (PairWord8Word8 _ b) = b+ curry f x y = f (PairWord8Word8 x y)++instance Adapt Word8 Word16 where+ data Pair Word8 Word16 = PairWord8Word16 {-# UNPACK #-}!Word8 {-# UNPACK #-}!Word16+ fst (PairWord8Word16 a _) = a+ snd (PairWord8Word16 _ b) = b+ curry f x y = f (PairWord8Word16 x y)++instance Adapt Word8 Word32 where+ data Pair Word8 Word32 = PairWord8Word32 {-# UNPACK #-}!Word8 {-# UNPACK #-}!Word32+ fst (PairWord8Word32 a _) = a+ snd (PairWord8Word32 _ b) = b+ curry f x y = f (PairWord8Word32 x y)++instance Adapt Word8 Word64 where+ data Pair Word8 Word64 = PairWord8Word64 {-# UNPACK #-}!Word8 {-# UNPACK #-}!Word64+ fst (PairWord8Word64 a _) = a+ snd (PairWord8Word64 _ b) = b+ curry f x y = f (PairWord8Word64 x y)++instance Adapt Word8 Double where+ data Pair Word8 Double = PairWord8Double {-# UNPACK #-}!Word8 {-# UNPACK #-}!Double+ fst (PairWord8Double a _) = a+ snd (PairWord8Double _ b) = b+ curry f x y = f (PairWord8Double x y)++instance Adapt Word8 Float where+ data Pair Word8 Float = PairWord8Float {-# UNPACK #-}!Word8 {-# UNPACK #-}!Float+ fst (PairWord8Float a _) = a+ snd (PairWord8Float _ b) = b+ curry f x y = f (PairWord8Float x y)++instance Adapt Word8 Char where+ data Pair Word8 Char = PairWord8Char {-# UNPACK #-}!Word8 {-# UNPACK #-}!Char+ fst (PairWord8Char a _) = a+ snd (PairWord8Char _ b) = b+ curry f x y = f (PairWord8Char x y)++instance Adapt Word16 Int where+ data Pair Word16 Int = PairWord16Int {-# UNPACK #-}!Word16 {-# UNPACK #-}!Int+ fst (PairWord16Int a _) = a+ snd (PairWord16Int _ b) = b+ curry f x y = f (PairWord16Int x y)++instance Adapt Word16 Integer where+ data Pair Word16 Integer = PairWord16Integer {-# UNPACK #-}!Word16 {-# UNPACK #-}!Integer+ fst (PairWord16Integer a _) = a+ snd (PairWord16Integer _ b) = b+ curry f x y = f (PairWord16Integer x y)++instance Adapt Word16 Int8 where+ data Pair Word16 Int8 = PairWord16Int8 {-# UNPACK #-}!Word16 {-# UNPACK #-}!Int8+ fst (PairWord16Int8 a _) = a+ snd (PairWord16Int8 _ b) = b+ curry f x y = f (PairWord16Int8 x y)++instance Adapt Word16 Int16 where+ data Pair Word16 Int16 = PairWord16Int16 {-# UNPACK #-}!Word16 {-# UNPACK #-}!Int16+ fst (PairWord16Int16 a _) = a+ snd (PairWord16Int16 _ b) = b+ curry f x y = f (PairWord16Int16 x y)++instance Adapt Word16 Int32 where+ data Pair Word16 Int32 = PairWord16Int32 {-# UNPACK #-}!Word16 {-# UNPACK #-}!Int32+ fst (PairWord16Int32 a _) = a+ snd (PairWord16Int32 _ b) = b+ curry f x y = f (PairWord16Int32 x y)++instance Adapt Word16 Int64 where+ data Pair Word16 Int64 = PairWord16Int64 {-# UNPACK #-}!Word16 {-# UNPACK #-}!Int64+ fst (PairWord16Int64 a _) = a+ snd (PairWord16Int64 _ b) = b+ curry f x y = f (PairWord16Int64 x y)++instance Adapt Word16 Word where+ data Pair Word16 Word = PairWord16Word {-# UNPACK #-}!Word16 {-# UNPACK #-}!Word+ fst (PairWord16Word a _) = a+ snd (PairWord16Word _ b) = b+ curry f x y = f (PairWord16Word x y)++instance Adapt Word16 Word8 where+ data Pair Word16 Word8 = PairWord16Word8 {-# UNPACK #-}!Word16 {-# UNPACK #-}!Word8+ fst (PairWord16Word8 a _) = a+ snd (PairWord16Word8 _ b) = b+ curry f x y = f (PairWord16Word8 x y)++instance Adapt Word16 Word16 where+ data Pair Word16 Word16 = PairWord16Word16 {-# UNPACK #-}!Word16 {-# UNPACK #-}!Word16+ fst (PairWord16Word16 a _) = a+ snd (PairWord16Word16 _ b) = b+ curry f x y = f (PairWord16Word16 x y)++instance Adapt Word16 Word32 where+ data Pair Word16 Word32 = PairWord16Word32 {-# UNPACK #-}!Word16 {-# UNPACK #-}!Word32+ fst (PairWord16Word32 a _) = a+ snd (PairWord16Word32 _ b) = b+ curry f x y = f (PairWord16Word32 x y)++instance Adapt Word16 Word64 where+ data Pair Word16 Word64 = PairWord16Word64 {-# UNPACK #-}!Word16 {-# UNPACK #-}!Word64+ fst (PairWord16Word64 a _) = a+ snd (PairWord16Word64 _ b) = b+ curry f x y = f (PairWord16Word64 x y)++instance Adapt Word16 Double where+ data Pair Word16 Double = PairWord16Double {-# UNPACK #-}!Word16 {-# UNPACK #-}!Double+ fst (PairWord16Double a _) = a+ snd (PairWord16Double _ b) = b+ curry f x y = f (PairWord16Double x y)++instance Adapt Word16 Float where+ data Pair Word16 Float = PairWord16Float {-# UNPACK #-}!Word16 {-# UNPACK #-}!Float+ fst (PairWord16Float a _) = a+ snd (PairWord16Float _ b) = b+ curry f x y = f (PairWord16Float x y)++instance Adapt Word16 Char where+ data Pair Word16 Char = PairWord16Char {-# UNPACK #-}!Word16 {-# UNPACK #-}!Char+ fst (PairWord16Char a _) = a+ snd (PairWord16Char _ b) = b+ curry f x y = f (PairWord16Char x y)++instance Adapt Word32 Int where+ data Pair Word32 Int = PairWord32Int {-# UNPACK #-}!Word32 {-# UNPACK #-}!Int+ fst (PairWord32Int a _) = a+ snd (PairWord32Int _ b) = b+ curry f x y = f (PairWord32Int x y)++instance Adapt Word32 Integer where+ data Pair Word32 Integer = PairWord32Integer {-# UNPACK #-}!Word32 {-# UNPACK #-}!Integer+ fst (PairWord32Integer a _) = a+ snd (PairWord32Integer _ b) = b+ curry f x y = f (PairWord32Integer x y)++instance Adapt Word32 Int8 where+ data Pair Word32 Int8 = PairWord32Int8 {-# UNPACK #-}!Word32 {-# UNPACK #-}!Int8+ fst (PairWord32Int8 a _) = a+ snd (PairWord32Int8 _ b) = b+ curry f x y = f (PairWord32Int8 x y)++instance Adapt Word32 Int16 where+ data Pair Word32 Int16 = PairWord32Int16 {-# UNPACK #-}!Word32 {-# UNPACK #-}!Int16+ fst (PairWord32Int16 a _) = a+ snd (PairWord32Int16 _ b) = b+ curry f x y = f (PairWord32Int16 x y)++instance Adapt Word32 Int32 where+ data Pair Word32 Int32 = PairWord32Int32 {-# UNPACK #-}!Word32 {-# UNPACK #-}!Int32+ fst (PairWord32Int32 a _) = a+ snd (PairWord32Int32 _ b) = b+ curry f x y = f (PairWord32Int32 x y)++instance Adapt Word32 Int64 where+ data Pair Word32 Int64 = PairWord32Int64 {-# UNPACK #-}!Word32 {-# UNPACK #-}!Int64+ fst (PairWord32Int64 a _) = a+ snd (PairWord32Int64 _ b) = b+ curry f x y = f (PairWord32Int64 x y)++instance Adapt Word32 Word where+ data Pair Word32 Word = PairWord32Word {-# UNPACK #-}!Word32 {-# UNPACK #-}!Word+ fst (PairWord32Word a _) = a+ snd (PairWord32Word _ b) = b+ curry f x y = f (PairWord32Word x y)++instance Adapt Word32 Word8 where+ data Pair Word32 Word8 = PairWord32Word8 {-# UNPACK #-}!Word32 {-# UNPACK #-}!Word8+ fst (PairWord32Word8 a _) = a+ snd (PairWord32Word8 _ b) = b+ curry f x y = f (PairWord32Word8 x y)++instance Adapt Word32 Word16 where+ data Pair Word32 Word16 = PairWord32Word16 {-# UNPACK #-}!Word32 {-# UNPACK #-}!Word16+ fst (PairWord32Word16 a _) = a+ snd (PairWord32Word16 _ b) = b+ curry f x y = f (PairWord32Word16 x y)++instance Adapt Word32 Word32 where+ data Pair Word32 Word32 = PairWord32Word32 {-# UNPACK #-}!Word32 {-# UNPACK #-}!Word32+ fst (PairWord32Word32 a _) = a+ snd (PairWord32Word32 _ b) = b+ curry f x y = f (PairWord32Word32 x y)++instance Adapt Word32 Word64 where+ data Pair Word32 Word64 = PairWord32Word64 {-# UNPACK #-}!Word32 {-# UNPACK #-}!Word64+ fst (PairWord32Word64 a _) = a+ snd (PairWord32Word64 _ b) = b+ curry f x y = f (PairWord32Word64 x y)++instance Adapt Word32 Double where+ data Pair Word32 Double = PairWord32Double {-# UNPACK #-}!Word32 {-# UNPACK #-}!Double+ fst (PairWord32Double a _) = a+ snd (PairWord32Double _ b) = b+ curry f x y = f (PairWord32Double x y)++instance Adapt Word32 Float where+ data Pair Word32 Float = PairWord32Float {-# UNPACK #-}!Word32 {-# UNPACK #-}!Float+ fst (PairWord32Float a _) = a+ snd (PairWord32Float _ b) = b+ curry f x y = f (PairWord32Float x y)++instance Adapt Word32 Char where+ data Pair Word32 Char = PairWord32Char {-# UNPACK #-}!Word32 {-# UNPACK #-}!Char+ fst (PairWord32Char a _) = a+ snd (PairWord32Char _ b) = b+ curry f x y = f (PairWord32Char x y)++instance Adapt Word64 Int where+ data Pair Word64 Int = PairWord64Int {-# UNPACK #-}!Word64 {-# UNPACK #-}!Int+ fst (PairWord64Int a _) = a+ snd (PairWord64Int _ b) = b+ curry f x y = f (PairWord64Int x y)++instance Adapt Word64 Integer where+ data Pair Word64 Integer = PairWord64Integer {-# UNPACK #-}!Word64 {-# UNPACK #-}!Integer+ fst (PairWord64Integer a _) = a+ snd (PairWord64Integer _ b) = b+ curry f x y = f (PairWord64Integer x y)++instance Adapt Word64 Int8 where+ data Pair Word64 Int8 = PairWord64Int8 {-# UNPACK #-}!Word64 {-# UNPACK #-}!Int8+ fst (PairWord64Int8 a _) = a+ snd (PairWord64Int8 _ b) = b+ curry f x y = f (PairWord64Int8 x y)++instance Adapt Word64 Int16 where+ data Pair Word64 Int16 = PairWord64Int16 {-# UNPACK #-}!Word64 {-# UNPACK #-}!Int16+ fst (PairWord64Int16 a _) = a+ snd (PairWord64Int16 _ b) = b+ curry f x y = f (PairWord64Int16 x y)++instance Adapt Word64 Int32 where+ data Pair Word64 Int32 = PairWord64Int32 {-# UNPACK #-}!Word64 {-# UNPACK #-}!Int32+ fst (PairWord64Int32 a _) = a+ snd (PairWord64Int32 _ b) = b+ curry f x y = f (PairWord64Int32 x y)++instance Adapt Word64 Int64 where+ data Pair Word64 Int64 = PairWord64Int64 {-# UNPACK #-}!Word64 {-# UNPACK #-}!Int64+ fst (PairWord64Int64 a _) = a+ snd (PairWord64Int64 _ b) = b+ curry f x y = f (PairWord64Int64 x y)++instance Adapt Word64 Word where+ data Pair Word64 Word = PairWord64Word {-# UNPACK #-}!Word64 {-# UNPACK #-}!Word+ fst (PairWord64Word a _) = a+ snd (PairWord64Word _ b) = b+ curry f x y = f (PairWord64Word x y)++instance Adapt Word64 Word8 where+ data Pair Word64 Word8 = PairWord64Word8 {-# UNPACK #-}!Word64 {-# UNPACK #-}!Word8+ fst (PairWord64Word8 a _) = a+ snd (PairWord64Word8 _ b) = b+ curry f x y = f (PairWord64Word8 x y)++instance Adapt Word64 Word16 where+ data Pair Word64 Word16 = PairWord64Word16 {-# UNPACK #-}!Word64 {-# UNPACK #-}!Word16+ fst (PairWord64Word16 a _) = a+ snd (PairWord64Word16 _ b) = b+ curry f x y = f (PairWord64Word16 x y)++instance Adapt Word64 Word32 where+ data Pair Word64 Word32 = PairWord64Word32 {-# UNPACK #-}!Word64 {-# UNPACK #-}!Word32+ fst (PairWord64Word32 a _) = a+ snd (PairWord64Word32 _ b) = b+ curry f x y = f (PairWord64Word32 x y)++instance Adapt Word64 Word64 where+ data Pair Word64 Word64 = PairWord64Word64 {-# UNPACK #-}!Word64 {-# UNPACK #-}!Word64+ fst (PairWord64Word64 a _) = a+ snd (PairWord64Word64 _ b) = b+ curry f x y = f (PairWord64Word64 x y)++instance Adapt Word64 Double where+ data Pair Word64 Double = PairWord64Double {-# UNPACK #-}!Word64 {-# UNPACK #-}!Double+ fst (PairWord64Double a _) = a+ snd (PairWord64Double _ b) = b+ curry f x y = f (PairWord64Double x y)++instance Adapt Word64 Float where+ data Pair Word64 Float = PairWord64Float {-# UNPACK #-}!Word64 {-# UNPACK #-}!Float+ fst (PairWord64Float a _) = a+ snd (PairWord64Float _ b) = b+ curry f x y = f (PairWord64Float x y)++instance Adapt Word64 Char where+ data Pair Word64 Char = PairWord64Char {-# UNPACK #-}!Word64 {-# UNPACK #-}!Char+ fst (PairWord64Char a _) = a+ snd (PairWord64Char _ b) = b+ curry f x y = f (PairWord64Char x y)++instance Adapt Double Int where+ data Pair Double Int = PairDoubleInt {-# UNPACK #-}!Double {-# UNPACK #-}!Int+ fst (PairDoubleInt a _) = a+ snd (PairDoubleInt _ b) = b+ curry f x y = f (PairDoubleInt x y)++instance Adapt Double Integer where+ data Pair Double Integer = PairDoubleInteger {-# UNPACK #-}!Double {-# UNPACK #-}!Integer+ fst (PairDoubleInteger a _) = a+ snd (PairDoubleInteger _ b) = b+ curry f x y = f (PairDoubleInteger x y)++instance Adapt Double Int8 where+ data Pair Double Int8 = PairDoubleInt8 {-# UNPACK #-}!Double {-# UNPACK #-}!Int8+ fst (PairDoubleInt8 a _) = a+ snd (PairDoubleInt8 _ b) = b+ curry f x y = f (PairDoubleInt8 x y)++instance Adapt Double Int16 where+ data Pair Double Int16 = PairDoubleInt16 {-# UNPACK #-}!Double {-# UNPACK #-}!Int16+ fst (PairDoubleInt16 a _) = a+ snd (PairDoubleInt16 _ b) = b+ curry f x y = f (PairDoubleInt16 x y)++instance Adapt Double Int32 where+ data Pair Double Int32 = PairDoubleInt32 {-# UNPACK #-}!Double {-# UNPACK #-}!Int32+ fst (PairDoubleInt32 a _) = a+ snd (PairDoubleInt32 _ b) = b+ curry f x y = f (PairDoubleInt32 x y)++instance Adapt Double Int64 where+ data Pair Double Int64 = PairDoubleInt64 {-# UNPACK #-}!Double {-# UNPACK #-}!Int64+ fst (PairDoubleInt64 a _) = a+ snd (PairDoubleInt64 _ b) = b+ curry f x y = f (PairDoubleInt64 x y)++instance Adapt Double Word where+ data Pair Double Word = PairDoubleWord {-# UNPACK #-}!Double {-# UNPACK #-}!Word+ fst (PairDoubleWord a _) = a+ snd (PairDoubleWord _ b) = b+ curry f x y = f (PairDoubleWord x y)++instance Adapt Double Word8 where+ data Pair Double Word8 = PairDoubleWord8 {-# UNPACK #-}!Double {-# UNPACK #-}!Word8+ fst (PairDoubleWord8 a _) = a+ snd (PairDoubleWord8 _ b) = b+ curry f x y = f (PairDoubleWord8 x y)++instance Adapt Double Word16 where+ data Pair Double Word16 = PairDoubleWord16 {-# UNPACK #-}!Double {-# UNPACK #-}!Word16+ fst (PairDoubleWord16 a _) = a+ snd (PairDoubleWord16 _ b) = b+ curry f x y = f (PairDoubleWord16 x y)++instance Adapt Double Word32 where+ data Pair Double Word32 = PairDoubleWord32 {-# UNPACK #-}!Double {-# UNPACK #-}!Word32+ fst (PairDoubleWord32 a _) = a+ snd (PairDoubleWord32 _ b) = b+ curry f x y = f (PairDoubleWord32 x y)++instance Adapt Double Word64 where+ data Pair Double Word64 = PairDoubleWord64 {-# UNPACK #-}!Double {-# UNPACK #-}!Word64+ fst (PairDoubleWord64 a _) = a+ snd (PairDoubleWord64 _ b) = b+ curry f x y = f (PairDoubleWord64 x y)++instance Adapt Double Double where+ data Pair Double Double = PairDoubleDouble {-# UNPACK #-}!Double {-# UNPACK #-}!Double+ fst (PairDoubleDouble a _) = a+ snd (PairDoubleDouble _ b) = b+ curry f x y = f (PairDoubleDouble x y)++instance Adapt Double Float where+ data Pair Double Float = PairDoubleFloat {-# UNPACK #-}!Double {-# UNPACK #-}!Float+ fst (PairDoubleFloat a _) = a+ snd (PairDoubleFloat _ b) = b+ curry f x y = f (PairDoubleFloat x y)++instance Adapt Double Char where+ data Pair Double Char = PairDoubleChar {-# UNPACK #-}!Double {-# UNPACK #-}!Char+ fst (PairDoubleChar a _) = a+ snd (PairDoubleChar _ b) = b+ curry f x y = f (PairDoubleChar x y)++instance Adapt Float Int where+ data Pair Float Int = PairFloatInt {-# UNPACK #-}!Float {-# UNPACK #-}!Int+ fst (PairFloatInt a _) = a+ snd (PairFloatInt _ b) = b+ curry f x y = f (PairFloatInt x y)++instance Adapt Float Integer where+ data Pair Float Integer = PairFloatInteger {-# UNPACK #-}!Float {-# UNPACK #-}!Integer+ fst (PairFloatInteger a _) = a+ snd (PairFloatInteger _ b) = b+ curry f x y = f (PairFloatInteger x y)++instance Adapt Float Int8 where+ data Pair Float Int8 = PairFloatInt8 {-# UNPACK #-}!Float {-# UNPACK #-}!Int8+ fst (PairFloatInt8 a _) = a+ snd (PairFloatInt8 _ b) = b+ curry f x y = f (PairFloatInt8 x y)++instance Adapt Float Int16 where+ data Pair Float Int16 = PairFloatInt16 {-# UNPACK #-}!Float {-# UNPACK #-}!Int16+ fst (PairFloatInt16 a _) = a+ snd (PairFloatInt16 _ b) = b+ curry f x y = f (PairFloatInt16 x y)++instance Adapt Float Int32 where+ data Pair Float Int32 = PairFloatInt32 {-# UNPACK #-}!Float {-# UNPACK #-}!Int32+ fst (PairFloatInt32 a _) = a+ snd (PairFloatInt32 _ b) = b+ curry f x y = f (PairFloatInt32 x y)++instance Adapt Float Int64 where+ data Pair Float Int64 = PairFloatInt64 {-# UNPACK #-}!Float {-# UNPACK #-}!Int64+ fst (PairFloatInt64 a _) = a+ snd (PairFloatInt64 _ b) = b+ curry f x y = f (PairFloatInt64 x y)++instance Adapt Float Word where+ data Pair Float Word = PairFloatWord {-# UNPACK #-}!Float {-# UNPACK #-}!Word+ fst (PairFloatWord a _) = a+ snd (PairFloatWord _ b) = b+ curry f x y = f (PairFloatWord x y)++instance Adapt Float Word8 where+ data Pair Float Word8 = PairFloatWord8 {-# UNPACK #-}!Float {-# UNPACK #-}!Word8+ fst (PairFloatWord8 a _) = a+ snd (PairFloatWord8 _ b) = b+ curry f x y = f (PairFloatWord8 x y)++instance Adapt Float Word16 where+ data Pair Float Word16 = PairFloatWord16 {-# UNPACK #-}!Float {-# UNPACK #-}!Word16+ fst (PairFloatWord16 a _) = a+ snd (PairFloatWord16 _ b) = b+ curry f x y = f (PairFloatWord16 x y)++instance Adapt Float Word32 where+ data Pair Float Word32 = PairFloatWord32 {-# UNPACK #-}!Float {-# UNPACK #-}!Word32+ fst (PairFloatWord32 a _) = a+ snd (PairFloatWord32 _ b) = b+ curry f x y = f (PairFloatWord32 x y)++instance Adapt Float Word64 where+ data Pair Float Word64 = PairFloatWord64 {-# UNPACK #-}!Float {-# UNPACK #-}!Word64+ fst (PairFloatWord64 a _) = a+ snd (PairFloatWord64 _ b) = b+ curry f x y = f (PairFloatWord64 x y)++instance Adapt Float Double where+ data Pair Float Double = PairFloatDouble {-# UNPACK #-}!Float {-# UNPACK #-}!Double+ fst (PairFloatDouble a _) = a+ snd (PairFloatDouble _ b) = b+ curry f x y = f (PairFloatDouble x y)++instance Adapt Float Float where+ data Pair Float Float = PairFloatFloat {-# UNPACK #-}!Float {-# UNPACK #-}!Float+ fst (PairFloatFloat a _) = a+ snd (PairFloatFloat _ b) = b+ curry f x y = f (PairFloatFloat x y)++instance Adapt Float Char where+ data Pair Float Char = PairFloatChar {-# UNPACK #-}!Float {-# UNPACK #-}!Char+ fst (PairFloatChar a _) = a+ snd (PairFloatChar _ b) = b+ curry f x y = f (PairFloatChar x y)++instance Adapt Char Int where+ data Pair Char Int = PairCharInt {-# UNPACK #-}!Char {-# UNPACK #-}!Int+ fst (PairCharInt a _) = a+ snd (PairCharInt _ b) = b+ curry f x y = f (PairCharInt x y)++instance Adapt Char Integer where+ data Pair Char Integer = PairCharInteger {-# UNPACK #-}!Char {-# UNPACK #-}!Integer+ fst (PairCharInteger a _) = a+ snd (PairCharInteger _ b) = b+ curry f x y = f (PairCharInteger x y)++instance Adapt Char Int8 where+ data Pair Char Int8 = PairCharInt8 {-# UNPACK #-}!Char {-# UNPACK #-}!Int8+ fst (PairCharInt8 a _) = a+ snd (PairCharInt8 _ b) = b+ curry f x y = f (PairCharInt8 x y)++instance Adapt Char Int16 where+ data Pair Char Int16 = PairCharInt16 {-# UNPACK #-}!Char {-# UNPACK #-}!Int16+ fst (PairCharInt16 a _) = a+ snd (PairCharInt16 _ b) = b+ curry f x y = f (PairCharInt16 x y)++instance Adapt Char Int32 where+ data Pair Char Int32 = PairCharInt32 {-# UNPACK #-}!Char {-# UNPACK #-}!Int32+ fst (PairCharInt32 a _) = a+ snd (PairCharInt32 _ b) = b+ curry f x y = f (PairCharInt32 x y)++instance Adapt Char Int64 where+ data Pair Char Int64 = PairCharInt64 {-# UNPACK #-}!Char {-# UNPACK #-}!Int64+ fst (PairCharInt64 a _) = a+ snd (PairCharInt64 _ b) = b+ curry f x y = f (PairCharInt64 x y)++instance Adapt Char Word where+ data Pair Char Word = PairCharWord {-# UNPACK #-}!Char {-# UNPACK #-}!Word+ fst (PairCharWord a _) = a+ snd (PairCharWord _ b) = b+ curry f x y = f (PairCharWord x y)++instance Adapt Char Word8 where+ data Pair Char Word8 = PairCharWord8 {-# UNPACK #-}!Char {-# UNPACK #-}!Word8+ fst (PairCharWord8 a _) = a+ snd (PairCharWord8 _ b) = b+ curry f x y = f (PairCharWord8 x y)++instance Adapt Char Word16 where+ data Pair Char Word16 = PairCharWord16 {-# UNPACK #-}!Char {-# UNPACK #-}!Word16+ fst (PairCharWord16 a _) = a+ snd (PairCharWord16 _ b) = b+ curry f x y = f (PairCharWord16 x y)++instance Adapt Char Word32 where+ data Pair Char Word32 = PairCharWord32 {-# UNPACK #-}!Char {-# UNPACK #-}!Word32+ fst (PairCharWord32 a _) = a+ snd (PairCharWord32 _ b) = b+ curry f x y = f (PairCharWord32 x y)++instance Adapt Char Word64 where+ data Pair Char Word64 = PairCharWord64 {-# UNPACK #-}!Char {-# UNPACK #-}!Word64+ fst (PairCharWord64 a _) = a+ snd (PairCharWord64 _ b) = b+ curry f x y = f (PairCharWord64 x y)++instance Adapt Char Double where+ data Pair Char Double = PairCharDouble {-# UNPACK #-}!Char {-# UNPACK #-}!Double+ fst (PairCharDouble a _) = a+ snd (PairCharDouble _ b) = b+ curry f x y = f (PairCharDouble x y)++instance Adapt Char Float where+ data Pair Char Float = PairCharFloat {-# UNPACK #-}!Char {-# UNPACK #-}!Float+ fst (PairCharFloat a _) = a+ snd (PairCharFloat _ b) = b+ curry f x y = f (PairCharFloat x y)++instance Adapt Char Char where+ data Pair Char Char = PairCharChar {-# UNPACK #-}!Char {-# UNPACK #-}!Char+ fst (PairCharChar a _) = a+ snd (PairCharChar _ b) = b+ curry f x y = f (PairCharChar x y)
+ LICENSE view
@@ -0,0 +1,29 @@+Copyright (c) Don Stewart 2005-2007+ (c) Duncan Coutts 2006-2007+ (c) David Roundy 2003-2005.++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions+are met:+1. Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.+2. Redistributions in binary form must reproduce the above copyright+ notice, this list of conditions and the following disclaimer in the+ documentation and/or other materials provided with the distribution.+3. Neither the name of the author nor the names of his contributors+ may be used to endorse or promote products derived from this software+ without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF+SUCH DAMAGE.
+ Setup.lhs view
@@ -0,0 +1,3 @@+#!/usr/bin/env runhaskell+> import Distribution.Simple+> main = defaultMain
+ adaptive-containers.cabal view
@@ -0,0 +1,36 @@+name: adaptive-containers+version: 0.1+homepage: http://code.haskell.org/~dons/code/adaptive-containers+synopsis: Self optimizing container types+description:+ Self optimizing polymorphic container types.+ + We use type families to specialize polymorphic container types to+ specific representations via class-associated data types.++ A self-optimizing pair, for example, will unpack the constructors,+ yielding a representation for (Int,Char) requiring 8 bytes, instead+ of 24.++ Currently supported adaptive types: pairs++category: Data+license: BSD3+license-file: LICENSE+author: Don Stewart+maintainer: Don Stewart (dons@galois.com)+cabal-version: >= 1.2.3+build-type: Simple++library+ exposed-modules: Data.Adaptive.Tuple++ ghc-options: -O2 -funbox-strict-fields -Wall+ ghc-prof-options: -prof -auto-all++ extensions: TypeFamilies,+ MultiParamTypeClasses,+ FlexibleInstances,+ OverlappingInstances++ build-depends: base
+ scripts/derive.hs view
@@ -0,0 +1,115 @@++{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ExistentialQuantification #-}+{-# OPTIONS -fglasgow-exts #-}++module AdaptiveDerive where++import Data.Generics+import Data.List+import Text.PrettyPrint+import Control.Monad++import Data.Int+import Data.Word++{-++instance Adapt Int Int where++ data Pair Int Int = PIntInt {-# UNPACK #-}!Int {-# UNPACK #-}!Int++ fst (PIntInt a _) = a+ snd (PIntInt _ b) = b+ curry f x y = f (PIntInt x y)+ uncurry f p = f (fst p) (snd p)++ -}++------------------------------------------------------------------------++main = sequence_ . intersperse (putStrLn "") $+ [ deriveM t u+ | Box t <- types+ , Box u <- types ]++data Box = forall a. (Typeable a, Data a) => Box a++types :: [Box]+types = [ Box (undefined :: Int)+ , Box (undefined :: Integer)+ , Box (undefined :: Int8)+ , Box (undefined :: Int16)+ , Box (undefined :: Int32)+ , Box (undefined :: Int64)+ , Box (undefined :: Word)+ , Box (undefined :: Word8)+ , Box (undefined :: Word16)+ , Box (undefined :: Word32)+ , Box (undefined :: Word64)+ , Box (undefined :: Double)+ , Box (undefined :: Float)+ , Box (undefined :: Char)+ ]++------------------------------------------------------------------------++deriveM :: forall a b . (Typeable a, Data a, Typeable b, Data b) => a -> b -> IO ()+deriveM (a :: a) (b :: b) = putStrLn $ derive (undefined :: a) (undefined :: b)+++derive :: (Typeable a, Data a, Typeable b, Data b) => a -> b -> String+derive x y = render $++ hang+ (hsep [text "instance", text "Adapt", text type_x, text type_y, text "where"])+ 4+ (vcat [+ hsep [ text "data"+ , text "Pair"+ , text type_x+ , text type_y+ , char '='+ , text myconstr+ , text "{-# UNPACK #-}!" <> text type_x+ , text "{-# UNPACK #-}!" <> text type_y+ ]++ ,hsep [text "fst"+ , parens (text myconstr <+> text "a _")+ , char '=' , char 'a' ]++ ,hsep [text "snd"+ , parens (text myconstr <+> text "_ b")+ , char '=' , char 'b' ]++ ,hsep [ text "curry"+ , char 'f'+ , char 'x'+ , char 'y'+ , char '='+ , char 'f' <+> parens (text myconstr <+> text "x y")+ ]++ ])++ where+ type_x = inst_a++ type_y = inst_b++ myconstr = "Pair" ++ type_x ++ type_y++ inst_a = wrap $ tyConString typeName ++ concatMap (" "++) typeLetters+ where (typeName,typeChildren) = splitTyConApp (typeOf x)+ typeLetters = take nTypeChildren manyLetters+ nTypeChildren = length typeChildren+ wrap x = if nTypeChildren > 0 then "("++x++")" else x++ inst_b = wrap $ tyConString typeName ++ concatMap (" "++) typeLetters+ where (typeName,typeChildren) = splitTyConApp (typeOf y)+ typeLetters = take nTypeChildren manyLetters+ nTypeChildren = length typeChildren+ wrap x = if nTypeChildren > 0 then "("++x++")" else x++ manyLetters = map (:[]) ['a'..'z']
+ scripts/size.hs view
@@ -0,0 +1,14 @@+{-# LANGUAGE MagicHash,UnboxedTuples #-}+module Size where++import GHC.Exts+import Foreign++unsafeSizeof :: a -> Int+unsafeSizeof a =+ case unpackClosure# a of+ (# x, ptrs, nptrs #) ->+ sizeOf (undefined::Int) + -- one word for the header+ I# (sizeofByteArray# (unsafeCoerce# ptrs)+ +# sizeofByteArray# nptrs)+