úÎ: 8"     "non-portable (uses GHC extensions)lemmih@gmail.com#GTo ensure that no-one reads or writes values without handling versions 2 correct, it is necessary to restrict access to  and .  This is where * enters the picture. It allows you to put < values in to a container but not to take them out again. A simple numeric version id. CThe centerpiece of this library. Defines a version for a data type , together with how it should be serialized/parsed. !Users should define instances of  for their types  even through  and  can't be used directly.  To serialize/parse a data type using , see    and  . The version of the type. FOnly used as a key so it must be unique (this is checked at run-time)  but doesn''t have to be sequential or continuous. The default version is '0'. <The kind specifies how versions are dealt with. By default, 2 values are tagged with their version id and don' t have any  previous versions. See  and the much less used  . GThis method defines how a value should be parsed without also worrying M about writing out the version tag. This function cannot be used directly.  One should use   , instead. HThis method defines how a value should be parsed without worrying about K previous versions or migrations. This function cannot be used directly.  One should use   , instead. AThe kind of a data type determines how it is tagged (if at all). Primitives kinds (see  ) are not tagged with a version * id and hence cannot be extended later. Extensions (see %) tells the system that there exists C a previous version of the data type which should be migrated if  needed. ?There is also a default kind which is neither primitive nor is $ an extension of a previous type. 8The central mechanism for dealing with version control. :This type class specifies what data migrations can happen  and how they happen. This is the type we'1re extending. Each type capable of migration can  only extend one other type. FThis method specifies how to migrate from the older type to the newer G one. It will never be necessary to use this function manually as it 0 all taken care of internally in the library.  JParse a version tagged data type and then migrate it to the desired type. L Any serialized value has been extended by the return type can be parsed. JParse a version tag and return the corresponding migrated parser. This is I useful when you can prove that multiple values have the same version.  See . ISerialize a data type by first writing out its version tag. This is much " simpler than the corresponding   since previous versions don't  come into play. KSerialize the version tag and return the associated putter. This is useful ? when serializing multiple values with the same version. See  . 6The extension kind lets the system know that there is A at least one previous version of this type. A given data type = can only extend a single other data type. However, it is @ perfectly fine to build chains of extensions. The migrations / between each step is handled automatically. Primitive kinds aren':t version tagged. This kind is used for small or built-in  types that won't change such as  or . +Place a value in an unbreakable container.  !"#$#   !"#$#   !"#$"non-portable (uses GHC extensions)lemmih@gmail.com    %      !"#$%&'() safecopy-0.4 Data.SafeCopyData.SafeCopy.SafeCopyData.SafeCopy.Instances ContainedVersionSafeCopyversionkindgetCopyputCopyKindMigrate MigrateFrommigratesafeGet getSafeGetsafePut getSafePut extension primitivecontainProxy unsafeUnPack unVersionExtendsBase PrimitiveconstructGetterFromVersionghc-prim GHC.TypesIntGHC.BoolBool castVersionavailableVersionscheckInvariantsversionFromProxy kindFromProxymkProxy asProxyType