-- | Unitary formats. module Data.Repa.Convert.Format.Unit ( UnitAsc (..)) where import Data.Repa.Convert.Internal.Format import Data.Repa.Convert.Internal.Packable import Data.Repa.Convert.Format.String import GHC.Exts import Data.Word import Prelude hiding (fail) #include "repa-convert.h" ------------------------------------------------------------------------------------------- UnitAsc -- | A particular ASCII string. data UnitAsc = UnitAsc String deriving (Eq, Show) instance Format UnitAsc where type Value UnitAsc = () fieldCount _ = 1 minSize (UnitAsc s) = length s fixedSize (UnitAsc s) = Just $ length s packedSize (UnitAsc s) () = Just $ length s {-# INLINE fieldCount #-} {-# INLINE minSize #-} {-# INLINE fixedSize #-} {-# INLINE packedSize #-} instance Packable UnitAsc where packer (UnitAsc s) () start k = packer (FixChars (length s)) s start k {-# INLINE packer #-} instance Unpackable UnitAsc where unpacker (UnitAsc str) start end stop fail eat = do (Ptr ptr, str') <- unpackCharList (pw8 start) (pw8 end) stop if str == str' then eat ptr () else fail {-# NOINLINE unpacker #-} pw8 :: Addr# -> Ptr Word8 pw8 addr = Ptr addr {-# INLINE pw8 #-}