| Copyright | (c) Justin Le 2014 |
|---|---|
| License | MIT |
| Maintainer | justin@jle.im |
| Stability | unstable |
| Portability | portable |
| Safe Haskell | None |
| Language | Haskell2010 |
Data.Binary.Tagged.Internal
Description
Internals for the library, exported in case you should need it.
Usually, the parts you would need should be re-exported in
Tagged.
- data Tagged a
- data TagFingerprint
- tag :: Typeable a => a -> Tagged a
- getTagged :: Typeable a => Tagged a -> Maybe a
- tagMatched :: Typeable a => Tagged a -> Bool
- typeFingerprint :: Typeable a => a -> TagFingerprint
- tagFingerprint :: Tagged a -> TagFingerprint
- bsFingerprint :: ByteString -> Maybe TagFingerprint
Data types
A data type tupling together data with a TagFingerprint,
representing data tagged with its type.
It's best to interface directly with data using encodeTagged,
decodeTagged, etc, using tag to tag data and extractTagged to
extract data from valid tagged data. This type is exported mostly when
you want to specifically decode a ByteString into tagged data, and
manually extract it yourself. If you are writing a framework, it is
preferred to handle this for the end user.
data TagFingerprint Source
A data type representing a fingerprint for a Typeable type.
Ideally, this would be Internal's own Fingerprint
types; however, for some reason, the fingerprints for the same data type
from the same modules differ between different GHC backends. So for
now, it is just a ByteString representation of the name of the type.
This is literally a bad idea, and so two types with the same name but
from different modules will share a non-unique TagFingerprint.
Hopefully in the future when I find out a way to fix this or the GHC
backend maintainers find a way to provide consistent type fingerprints,
this will be fixed.
This type is mostly used for the ability to categorized Tagged items by their type.
There is a Default instance, because the constructor is hidden. For
now, it is just an empty ByteString, but when fingerprinting works for
real, think of it as a way to generate a fingerprint that will most
likely not be matched by any type, in case the need ever comes up.
Instances
| Eq TagFingerprint | |
| Ord TagFingerprint | |
| Show TagFingerprint | |
| Generic TagFingerprint | |
| Binary TagFingerprint | |
| Default TagFingerprint |
|
| Typeable * TagFingerprint | |
| type Rep TagFingerprint |
Tagging and extracting data
tagMatched :: Typeable a => Tagged a -> Bool Source
Check if the type inside the Tagged matches the fingerprint.
TagFingerprint utilities
typeFingerprint :: Typeable a => a -> TagFingerprint Source
Compute the Fingerprint representing a type. It is non-strict on
its parameter, so passing in undefined should work if you want to just
get the Fingerprint of a specific type without having data of that
type on hand:
typeFingerprint (undefined :: Int)
tagFingerprint :: Tagged a -> TagFingerprint Source
Extract the Fingerprint out of a Tagged. Mostly used so that you
can categorize and associate Tagged items; to check if a Tagged is
of a desired typed, getTagged and tagMatched might be more useful.
bsFingerprint :: ByteString -> Maybe TagFingerprint Source
With a ByteString, expecting tagged data, returns the Fingerprint
that the data is tagged with. Returns Nothing if the data is not
decodable as tagged data. Might accidentally decode untagged data
though!