module Data.Columbia.Types where
import Data.Typeable hiding (Proxy)
import Data.Word
import Control.Monad.Reader hiding (Functor)
import Data.Generics.SYB.WithClass.Basics
import Generics.Pointless.Functors hiding (Functor)
type Pointer = Word32
data SeekableStream m c = SeekableStream
{ __consumeToken :: !(m(Maybe c)), __consumeIntegralToken :: !(m(Maybe Word32)), __seek :: !(Pointer -> m()), __getPosition :: !(m Pointer), __seekAtEnd :: !(m()), __isLockLive :: !(m Bool) } deriving Functor
data SeekableWriter m c = SeekableWriter
{ _putToken :: !(c -> m()), _putIntegralToken :: !(Word32 -> m()), stream :: !(SeekableStream m c) }
class (Typeable t) => RW t where
readData :: (Monad m) => ReaderT(SeekableStream m Word8) m t
readData = fail$"RW.readData: unimplemented for " ++ show(typeOf(undefined :: t))
writeData :: (Monad m) => t -> ReaderT(SeekableWriter m Word8) m ()
writeData = fail$"RW.writeData: unimplemented for " ++ show(typeOf(undefined :: t))
data RWCtx a = (RW a) => RWCtx
type PolyTraversal ctx m d = Proxy ctx
-> (forall a. (Data ctx a) => ReaderT(SeekableStream m Word8) m a)
-> ReaderT(SeekableStream m Word8) m d
type PolyTraversalW ctx m d = Proxy ctx
-> (forall a. (Data ctx a) => a -> ReaderT(SeekableWriter m Word8) m ())
-> d -> ReaderT(SeekableWriter m Word8) m ()
data LazyFix f = LazyFix(Rep f(LazyFix f))
data LazyMap k v = BinPrime { lazy_map_size :: Int,
lazy_map_key :: k,
lazy_map_value :: v,
lazy_map_bin1 :: WithAddress(LazyMap k v),
lazy_map_bin2 :: WithAddress(LazyMap k v) } | TipPrime
deriving (Eq, Ord, Show, Typeable)
class KeyComparable t where
isKeyed :: t->Bool
isKeyed _ = False
keyCompare :: t -> t->Ordering
keyCompare _ _ = error"KeyComparable.keyCompare: is not a keyed data type"
data KeyCtx t = (KeyComparable t) => KeyCtx
data WithAddress t = WithAddress Pointer t
deriving (Eq, Ord, Show, Typeable)
data Header = Header !Word8 !ConIndex !Int
isUArray :: Header -> Bool
isUArray (Header n _ _) = n == 3
isArray :: Header -> Bool
isArray (Header n _ _) = n == 2
isPrimtype :: Header -> Bool
isPrimtype (Header n _ _) = n == 1
isAlgtype :: Header -> Bool
isAlgtype (Header n _ _) = n == 0
getConIndex :: Header -> ConIndex
getConIndex (Header _ i _) = i
getNFields :: Header -> Int
getNFields (Header _ _ n) = n