convert (empty) → 1.0
raw patch · 12 files changed
+820/−0 lines, 12 filesdep +basedep +bytestringdep +containerssetup-changed
Dependencies added: base, bytestring, containers, either, lens, mtl, old-locale, old-time, template-haskell, text, time
Files
- Data/Convert.hs +5/−0
- Data/Convert/Base.hs +69/−0
- Data/Convert/Bound.hs +165/−0
- Data/Convert/Errors.hs +5/−0
- Data/Convert/Instances.hs +6/−0
- Data/Convert/Instances/Map.hs +13/−0
- Data/Convert/Instances/Num.hs +66/−0
- Data/Convert/Instances/TH.hs +10/−0
- Data/Convert/Instances/Text.hs +217/−0
- LICENSE +202/−0
- Setup.lhs +6/−0
- convert.cabal +56/−0
+ Data/Convert.hs view
@@ -0,0 +1,5 @@++module Data.Convert (module X) where++import Data.Convert.Base as X+import Data.Convert.Instances ()
+ Data/Convert/Base.hs view
@@ -0,0 +1,69 @@+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE RankNTypes #-}++{-# LANGUAGE CPP #-}+#if __GLASGOW_HASKELL__ < 710+{-# LANGUAGE OverlappingInstances #-}+#endif++module Data.Convert.Base where++import Control.Lens++----------------------------------------------------------------------+-- Conversions+----------------------------------------------------------------------++class MaybeConvertible a e b | a b -> e where+ tryConvert :: a -> Either e b++class MaybeConvertible' a e b | b -> a e where+ tryConvert' :: a -> Either e b++class Convertible a b where+ convert :: a -> b++-- Maybe we should change the name to Specializable and specialize?+class Convertible' a b | b -> a where+ convert' :: a -> b++class Castable a b where+ cast :: a -> b++type IsoMaybeConvertible a e b = (MaybeConvertible a e b, MaybeConvertible b e a)+type IsoMaybeConvertible' a e b = (MaybeConvertible' a e b, MaybeConvertible' b e a)+type IsoConvertible a b = (Convertible a b , Convertible b a )+type IsoConvertible' a b = (Convertible' a b , Convertible' b a )+type IsoCastable a b = (Castable a b , Castable b a )++class ConvertibleM m n where convertM :: m (t1 :: k) -> n (t1 :: k)+class ConvertibleM2 m n where convertM2 :: m (t1 :: k) (t2 :: k) -> n (t1 :: k) (t2 :: k)+class ConvertibleM3 m n where convertM3 :: m (t1 :: k) (t2 :: k) (t3 :: k) -> n (t1 :: k) (t2 :: k) (t3 :: k)+class ConvertibleM4 m n where convertM4 :: m (t1 :: k) (t2 :: k) (t3 :: k) (t4 :: k) -> n (t1 :: k) (t2 :: k) (t3 :: k) (t4 :: k)+class ConvertibleM5 m n where convertM5 :: m (t1 :: k) (t2 :: k) (t3 :: k) (t4 :: k) (t5 :: k) -> n (t1 :: k) (t2 :: k) (t3 :: k) (t4 :: k) (t5 :: k)++-- utils++unsafeConvert :: Show e => MaybeConvertible a e b => a -> b+unsafeConvert a =+ case tryConvert a of+ Left e -> error $ show e+ Right r -> r++casted :: IsoCastable a b => Iso' a b+casted = iso cast cast++converted :: IsoConvertible a b => Iso' a b+converted = iso convert convert++-- instances++instance {-# OVERLAPPABLE #-} Convertible a a where convert = id++instance {-# OVERLAPPABLE #-} Convertible a b => Convertible (Maybe a) (Maybe b) where+ convert = fmap convert++instance {-# OVERLAPPABLE #-} Convertible a b => Castable a b where+ cast = convert
+ Data/Convert/Bound.hs view
@@ -0,0 +1,165 @@+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE NoMonomorphismRestriction #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE DeriveFunctor #-}+{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE ViewPatterns #-}++module Data.Convert.Bound where++import Data.Convert.Base+import Data.Typeable+import Control.Applicative+import Language.Haskell.TH hiding (Type, Safety, Safe, Unsafe)+import Data.Monoid+import GHC.TypeLits+import Prelude hiding (Bounded, maxBound, minBound)+import qualified Prelude as Prelude+++++-- === The runtime used safe conversion ===++-- TODO [wd]: We can optimize it further. Right now we are converting everything to Rational and comparing.+-- It's because sometimes we are converting between types of different bounds like Char and Int8+-- - neither can we safely convert Char to Int 8 nor vice versa.+-- We can though make typeclasses that will find the smallest super-type for a given type pair+-- and convert both values to that super-type+boundedConversion :: (Bounded b, Ord a, Convertible a Rational, Convertible (Bounds b) (Bounds Rational))+ => (a -> b) -> (a -> Either BoundError b)+boundedConversion (func :: a -> b) inp = if (convert inp) `boundedBy` (convert (bounds :: Bounds b) :: Bounds Rational)+ then Right $ func inp+ else Left BoundError+++++-- === Errors ===++data BoundError = BoundError deriving (Show)+++-- === Conversion ===++data Conversion = Conversion (Q Exp) Type Type++class Conversions a b where+ conversions :: Q Exp -> a -> b -> [Conversion]++-- utils++genConversion :: Conversion -> Q Dec+genConversion c@(Conversion qexp (Type name bounds) (Type name' bounds')) = do+ exp <- qexp :: Q Exp+ let convf name fmod = [ValD (VarP $ mkName name) (NormalB $ fmod exp) []]+ return $ if bounds `isSubBound` bounds'+ then InstanceD [] (AppT (AppT (ConT $ mkName "Convertible") (ConT name)) (ConT name')) $ convf "convert" id+ else InstanceD [] (AppT (AppT (AppT (ConT $ mkName "MaybeConvertible") (ConT name)) (ConT $ mkName "BoundError")) (ConT name')) $ convf "tryConvert" $ AppE (VarE $ mkName "boundedConversion")+++genConversions :: [Conversion] -> Q [Dec]+genConversions = mapM genConversion++-- instances++instance Conversions [Type] [Type] where conversions f a b = Conversion f <$> a <*> b+instance Conversions Type [Type] where conversions f a b = Conversion f a <$> b+instance Conversions [Type] Type where conversions f a b = flip (Conversion f) b <$> a+instance Conversions Type Type where conversions f a b = [Conversion f a b]++instance Show Conversion where+ show (Conversion _ a b) = "Conversion " -- <> " " <> name a <> " " <> name b+++++-- === Type ===++data Type = Type { name :: Name+ , tbounds :: (Bounds Integer)+ } deriving (Show, Eq)++++-- === Layout ===+data Layout = IntLayout Sign Integer+ | InfiniteLayout+ deriving (Show, Eq)++data Sign = Signed+ | Unsigned+ deriving (Show, Eq)++layoutBounds :: Layout -> Bounds Integer+layoutBounds = \case+ InfiniteLayout -> infiniteBounds+ IntLayout s i -> Bounds (Value (- base)) (Value $ base - 1)+ where base = case s of+ Signed -> 2 ^ (i - 1)+ Unsigned -> 2 ^ i++++-- === Value ===++data Value a = MinusInfinity+ | Value a+ | Infinity+ deriving (Show, Functor, Eq)++-- instances++instance Num a => Num (Value a) where+ fromInteger = Value . fromInteger++instance Convertible a b => Convertible (Value a) (Value b) where+ convert (Value a) = Value $ convert a++instance Ord a => Ord (Value a) where+ compare MinusInfinity MinusInfinity = EQ+ compare MinusInfinity a = LT+ compare a MinusInfinity = GT+ compare Infinity Infinity = EQ+ compare Infinity a = GT+ compare a Infinity = LT+ compare (Value a) (Value a') = compare a a'+++++-- === Bounds ===++data Bounds a = Bounds (Value a) (Value a) deriving (Show, Functor, Eq)++class Bounded a where+ bounds :: Bounds a++-- utils++infiniteBounds :: Bounds a+infiniteBounds = Bounds MinusInfinity Infinity++isSubBound :: Ord a => Bounds a -> Bounds a -> Bool+isSubBound (Bounds min max) (Bounds min' max') = min >= min' && max <= max'++boundedBy :: Ord a => a -> Bounds a -> Bool+boundedBy (Value -> a) (Bounds min max) = a >= min && a <= max++-- instances+instance {-# OVERLAPPABLE #-} Convertible a b => Convertible (Bounds a) (Bounds b) where+ convert (Bounds a b) = Bounds (convert a) (convert b)++instance {-# OVERLAPPABLE #-} (Prelude.Bounded a)+ => Bounded a where+ bounds = Bounds (Value Prelude.minBound) (Value Prelude.maxBound)++instance {-# OVERLAPPABLE #-} Bounded Float where bounds = infiniteBounds+instance {-# OVERLAPPABLE #-} Bounded Double where bounds = infiniteBounds+instance {-# OVERLAPPABLE #-} Bounded Rational where bounds = infiniteBounds+instance {-# OVERLAPPABLE #-} Bounded Integer where bounds = infiniteBounds
+ Data/Convert/Errors.hs view
@@ -0,0 +1,5 @@+module Data.Convert.Errors where++import Data.Typeable++data TypeMismatch = TypeMismatch TypeRep TypeRep deriving (Show)
+ Data/Convert/Instances.hs view
@@ -0,0 +1,6 @@+module Data.Convert.Instances () where++import Data.Convert.Instances.Map ()+import Data.Convert.Instances.Num ()+import Data.Convert.Instances.Text ()+import Data.Convert.Instances.TH ()
+ Data/Convert/Instances/Map.hs view
@@ -0,0 +1,13 @@+module Data.Convert.Instances.Map()+where++import Data.Convert.Base++import qualified Data.Map as Map+++instance Ord k => Convertible [(k, a)] (Map.Map k a) where+ convert = Map.fromList++instance Convertible (Map.Map k a) [(k, a)] where+ convert = Map.toList
+ Data/Convert/Instances/Num.hs view
@@ -0,0 +1,66 @@+{-# LANGUAGE NoMonomorphismRestriction #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TemplateHaskell #-}++module Data.Convert.Instances.Num where++import Data.Convert.Bound+import Data.Convert.Base+import Data.Monoid+import qualified Data.ByteString as BS+import GHC.Int+import Data.Word+import Data.Bits (shiftR)++intTypes = [ Type ''Int $ layoutBounds $ IntLayout Signed 30 -- according to: https://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Int.html#t:Int+ , Type ''Integer $ layoutBounds $ InfiniteLayout+ , Type ''Int8 $ layoutBounds $ IntLayout Signed 8+ , Type ''Int16 $ layoutBounds $ IntLayout Signed 16+ , Type ''Int32 $ layoutBounds $ IntLayout Signed 32+ , Type ''Int64 $ layoutBounds $ IntLayout Signed 64+ ]++wordTypes = [ Type ''Word $ layoutBounds $ IntLayout Signed 30 -- according to: https://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Int.html#t:Int+ , Type ''Word8 $ layoutBounds $ IntLayout Signed 8+ , Type ''Word16 $ layoutBounds $ IntLayout Signed 16+ , Type ''Word32 $ layoutBounds $ IntLayout Signed 32+ , Type ''Word64 $ layoutBounds $ IntLayout Signed 64+ ]++floatTypes = [ Type ''Float $ layoutBounds $ InfiniteLayout+ , Type ''Double $ layoutBounds $ InfiniteLayout+ , Type ''Rational $ layoutBounds $ InfiniteLayout+ ]++charType = Type ''Char $ Bounds 0 1114111 -- max char enum is 1114111++integralTypes = intTypes <> wordTypes++-------------++instance Convertible () [t] where convert _ = []+instance Convertible (t,t) [t] where convert (t1,t2) = [t1,t2]+instance Convertible (t,t,t) [t] where convert (t1,t2,t3) = [t1,t2,t3]+instance Convertible (t,t,t,t) [t] where convert (t1,t2,t3,t4) = [t1,t2,t3,t4]+instance Convertible (t,t,t,t,t) [t] where convert (t1,t2,t3,t4,t5) = [t1,t2,t3,t4,t5]+instance Convertible (t,t,t,t,t,t) [t] where convert (t1,t2,t3,t4,t5,t6) = [t1,t2,t3,t4,t5,t6]+instance Convertible (t,t,t,t,t,t,t) [t] where convert (t1,t2,t3,t4,t5,t6,t7) = [t1,t2,t3,t4,t5,t6,t7]+instance Convertible (t,t,t,t,t,t,t,t) [t] where convert (t1,t2,t3,t4,t5,t6,t7,t8) = [t1,t2,t3,t4,t5,t6,t7,t8]+instance Convertible (t,t,t,t,t,t,t,t,t) [t] where convert (t1,t2,t3,t4,t5,t6,t7,t8,t9) = [t1,t2,t3,t4,t5,t6,t7,t8,t9]+++-- TODO: http://stackoverflow.com/questions/8350814/converting-64-bit-double-to-bytestring-efficiently+instance Convertible Word64 (Word8,Word8,Word8,Word8,Word8,Word8,Word8,Word8) where+ convert word = (unpack 56, unpack 48, unpack 40, unpack 32, unpack 24, unpack 16, unpack 8, unpack 0)+ where unpack = fromIntegral . shiftR word++-- ...++--------------++numConversions = conversions [| fromIntegral |] integralTypes (integralTypes <> floatTypes)+ <> conversions [| truncate |] floatTypes integralTypes+ <> conversions [| realToFrac |] floatTypes floatTypes+ <> conversions [| fromIntegral . fromEnum |] charType (integralTypes <> floatTypes)+ <> conversions [| toEnum . fromIntegral |] integralTypes charType
+ Data/Convert/Instances/TH.hs view
@@ -0,0 +1,10 @@+{-# LANGUAGE TemplateHaskell #-}++module Data.Convert.Instances.TH where++import Data.Convert.Base+import Data.Convert.Bound+import Data.Convert.Instances.Num (numConversions)+++genConversions numConversions
+ Data/Convert/Instances/Text.hs view
@@ -0,0 +1,217 @@+{-# LANGUAGE ExistentialQuantification #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE CPP #-}+++module Data.Convert.Instances.Text()+where++import Data.Convert.Base+import qualified Data.Text as TS+import qualified Data.Text.Encoding as TE+import qualified Data.Text.Lazy as TL+import qualified Data.Text.Lazy.Builder as TLB+import qualified Data.Text.Lazy.Encoding as TLE+import qualified Data.ByteString as BS+import qualified Data.ByteString.Lazy as BL+import qualified Data.ByteString.Builder as BB+import Data.Word (Word8)+import Data.Foldable++++instance Convertible TS.Text [Char] where+ {-# INLINE convert #-}+ convert = TS.unpack++instance Convertible TS.Text TL.Text where+ {-# INLINE convert #-}+ convert = TL.fromStrict++instance Convertible TS.Text TLB.Builder where+ {-# INLINE convert #-}+ convert = TLB.fromText++instance Convertible TS.Text BS.ByteString where+ {-# INLINE convert #-}+ convert = TE.encodeUtf8++instance Convertible TS.Text BL.ByteString where+ {-# INLINE convert #-}+ convert = BL.fromStrict . TE.encodeUtf8++instance Convertible TS.Text BB.Builder where+ {-# INLINE convert #-}+#if MIN_VERSION_text(1,2,0)+ convert = TE.encodeUtf8Builder+#else+ convert = convert . TE.encodeUtf8+#endif++++instance Convertible TL.Text [Char] where+ {-# INLINE convert #-}+ convert = TL.unpack++instance Convertible TL.Text TS.Text where+ {-# INLINE convert #-}+ convert = TL.toStrict++instance Convertible TL.Text TLB.Builder where+ {-# INLINE convert #-}+ convert = TLB.fromLazyText++instance Convertible TL.Text BS.ByteString where+ {-# INLINE convert #-}+ convert = convert . TLE.encodeUtf8++instance Convertible TL.Text BL.ByteString where+ {-# INLINE convert #-}+ convert = TLE.encodeUtf8++instance Convertible TL.Text BB.Builder where+ {-# INLINE convert #-}+#if MIN_VERSION_text(1,2,0)+ convert = TLE.encodeUtf8Builder+#else+ convert = convert . TLE.encodeUtf8+#endif++++instance Convertible TLB.Builder [Char] where+ {-# INLINE convert #-}+ convert = convert . TLB.toLazyText++instance Convertible TLB.Builder TS.Text where+ {-# INLINE convert #-}+ convert = convert . TLB.toLazyText++instance Convertible TLB.Builder TL.Text where+ {-# INLINE convert #-}+ convert = TLB.toLazyText++instance Convertible TLB.Builder BS.ByteString where+ {-# INLINE convert #-}+ convert = convert . TLB.toLazyText++instance Convertible TLB.Builder BL.ByteString where+ {-# INLINE convert #-}+ convert = convert . TLB.toLazyText++instance Convertible TLB.Builder BB.Builder where+ {-# INLINE convert #-}+ convert = convert . TLB.toLazyText++++instance Convertible BS.ByteString [Word8] where+ {-# INLINE convert #-}+ convert = BS.unpack++instance Convertible BS.ByteString TS.Text where+ {-# INLINE convert #-}+ convert = TE.decodeUtf8++instance Convertible BS.ByteString TL.Text where+ {-# INLINE convert #-}+ convert = TL.fromStrict . convert++instance Convertible BS.ByteString TLB.Builder where+ {-# INLINE convert #-}+ convert = TLB.fromText . convert++instance Convertible BS.ByteString BL.ByteString where+ {-# INLINE convert #-}+ convert = BL.fromStrict++instance Convertible BS.ByteString BB.Builder where+ {-# INLINE convert #-}+ convert = BB.byteString++++instance Convertible BL.ByteString [Word8] where+ {-# INLINE convert #-}+ convert = BL.unpack++instance Convertible BL.ByteString TS.Text where+ {-# INLINE convert #-}+ convert = TL.toStrict . convert++instance Convertible BL.ByteString TL.Text where+ {-# INLINE convert #-}+ convert = TLE.decodeUtf8++instance Convertible BL.ByteString TLB.Builder where+ {-# INLINE convert #-}+ convert = TLB.fromLazyText . convert++instance Convertible BL.ByteString BS.ByteString where+ {-# INLINE convert #-}+ convert = BL.toStrict++instance Convertible BL.ByteString BB.Builder where+ {-# INLINE convert #-}+ convert = BB.lazyByteString++++instance Convertible [Char] TS.Text where+ {-# INLINE convert #-}+ convert = TS.pack++instance Convertible [Char] TL.Text where+ {-# INLINE convert #-}+ convert = TL.pack++instance Convertible [Char] TLB.Builder where+ {-# INLINE convert #-}+ convert = TLB.fromString++++instance Convertible [Word8] BS.ByteString where+ {-# INLINE convert #-}+ convert = BS.pack++instance Convertible [Word8] BL.ByteString where+ {-# INLINE convert #-}+ convert = BL.pack++instance Convertible [Word8] BB.Builder where+ {-# INLINE convert #-}+ convert = foldMap BB.word8++++instance Convertible Char TS.Text where+ {-# INLINE convert #-}+ convert = TS.singleton++instance Convertible Char TL.Text where+ {-# INLINE convert #-}+ convert = TL.singleton++instance Convertible Char TLB.Builder where+ {-# INLINE convert #-}+ convert = TLB.singleton++++instance Convertible Word8 BS.ByteString where+ {-# INLINE convert #-}+ convert = BS.singleton++instance Convertible Word8 BL.ByteString where+ {-# INLINE convert #-}+ convert = BL.singleton++instance Convertible Word8 BB.Builder where+ {-# INLINE convert #-}+ convert = BB.word8
+ LICENSE view
@@ -0,0 +1,202 @@++ Apache License+ Version 2.0, January 2004+ http://www.apache.org/licenses/++ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION++ 1. Definitions.++ "License" shall mean the terms and conditions for use, reproduction,+ and distribution as defined by Sections 1 through 9 of this document.++ "Licensor" shall mean the copyright owner or entity authorized by+ the copyright owner that is granting the License.++ "Legal Entity" shall mean the union of the acting entity and all+ other entities that control, are controlled by, or are under common+ control with that entity. For the purposes of this definition,+ "control" means (i) the power, direct or indirect, to cause the+ direction or management of such entity, whether by contract or+ otherwise, or (ii) ownership of fifty percent (50%) or more of the+ outstanding shares, or (iii) beneficial ownership of such entity.++ "You" (or "Your") shall mean an individual or Legal Entity+ exercising permissions granted by this License.++ "Source" form shall mean the preferred form for making modifications,+ including but not limited to software source code, documentation+ source, and configuration files.++ "Object" form shall mean any form resulting from mechanical+ transformation or translation of a Source form, including but+ not limited to compiled object code, generated documentation,+ and conversions to other media types.++ "Work" shall mean the work of authorship, whether in Source or+ Object form, made available under the License, as indicated by a+ copyright notice that is included in or attached to the work+ (an example is provided in the Appendix below).++ "Derivative Works" shall mean any work, whether in Source or Object+ form, that is based on (or derived from) the Work and for which the+ editorial revisions, annotations, elaborations, or other modifications+ represent, as a whole, an original work of authorship. For the purposes+ of this License, Derivative Works shall not include works that remain+ separable from, or merely link (or bind by name) to the interfaces of,+ the Work and Derivative Works thereof.++ "Contribution" shall mean any work of authorship, including+ the original version of the Work and any modifications or additions+ to that Work or Derivative Works thereof, that is intentionally+ submitted to Licensor for inclusion in the Work by the copyright owner+ or by an individual or Legal Entity authorized to submit on behalf of+ the copyright owner. For the purposes of this definition, "submitted"+ means any form of electronic, verbal, or written communication sent+ to the Licensor or its representatives, including but not limited to+ communication on electronic mailing lists, source code control systems,+ and issue tracking systems that are managed by, or on behalf of, the+ Licensor for the purpose of discussing and improving the Work, but+ excluding communication that is conspicuously marked or otherwise+ designated in writing by the copyright owner as "Not a Contribution."++ "Contributor" shall mean Licensor and any individual or Legal Entity+ on behalf of whom a Contribution has been received by Licensor and+ subsequently incorporated within the Work.++ 2. Grant of Copyright License. Subject to the terms and conditions of+ this License, each Contributor hereby grants to You a perpetual,+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable+ copyright license to reproduce, prepare Derivative Works of,+ publicly display, publicly perform, sublicense, and distribute the+ Work and such Derivative Works in Source or Object form.++ 3. Grant of Patent License. Subject to the terms and conditions of+ this License, each Contributor hereby grants to You a perpetual,+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable+ (except as stated in this section) patent license to make, have made,+ use, offer to sell, sell, import, and otherwise transfer the Work,+ where such license applies only to those patent claims licensable+ by such Contributor that are necessarily infringed by their+ Contribution(s) alone or by combination of their Contribution(s)+ with the Work to which such Contribution(s) was submitted. If You+ institute patent litigation against any entity (including a+ cross-claim or counterclaim in a lawsuit) alleging that the Work+ or a Contribution incorporated within the Work constitutes direct+ or contributory patent infringement, then any patent licenses+ granted to You under this License for that Work shall terminate+ as of the date such litigation is filed.++ 4. Redistribution. You may reproduce and distribute copies of the+ Work or Derivative Works thereof in any medium, with or without+ modifications, and in Source or Object form, provided that You+ meet the following conditions:++ (a) You must give any other recipients of the Work or+ Derivative Works a copy of this License; and++ (b) You must cause any modified files to carry prominent notices+ stating that You changed the files; and++ (c) You must retain, in the Source form of any Derivative Works+ that You distribute, all copyright, patent, trademark, and+ attribution notices from the Source form of the Work,+ excluding those notices that do not pertain to any part of+ the Derivative Works; and++ (d) If the Work includes a "NOTICE" text file as part of its+ distribution, then any Derivative Works that You distribute must+ include a readable copy of the attribution notices contained+ within such NOTICE file, excluding those notices that do not+ pertain to any part of the Derivative Works, in at least one+ of the following places: within a NOTICE text file distributed+ as part of the Derivative Works; within the Source form or+ documentation, if provided along with the Derivative Works; or,+ within a display generated by the Derivative Works, if and+ wherever such third-party notices normally appear. The contents+ of the NOTICE file are for informational purposes only and+ do not modify the License. You may add Your own attribution+ notices within Derivative Works that You distribute, alongside+ or as an addendum to the NOTICE text from the Work, provided+ that such additional attribution notices cannot be construed+ as modifying the License.++ You may add Your own copyright statement to Your modifications and+ may provide additional or different license terms and conditions+ for use, reproduction, or distribution of Your modifications, or+ for any such Derivative Works as a whole, provided Your use,+ reproduction, and distribution of the Work otherwise complies with+ the conditions stated in this License.++ 5. Submission of Contributions. Unless You explicitly state otherwise,+ any Contribution intentionally submitted for inclusion in the Work+ by You to the Licensor shall be under the terms and conditions of+ this License, without any additional terms or conditions.+ Notwithstanding the above, nothing herein shall supersede or modify+ the terms of any separate license agreement you may have executed+ with Licensor regarding such Contributions.++ 6. Trademarks. This License does not grant permission to use the trade+ names, trademarks, service marks, or product names of the Licensor,+ except as required for reasonable and customary use in describing the+ origin of the Work and reproducing the content of the NOTICE file.++ 7. Disclaimer of Warranty. Unless required by applicable law or+ agreed to in writing, Licensor provides the Work (and each+ Contributor provides its Contributions) on an "AS IS" BASIS,+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or+ implied, including, without limitation, any warranties or conditions+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A+ PARTICULAR PURPOSE. You are solely responsible for determining the+ appropriateness of using or redistributing the Work and assume any+ risks associated with Your exercise of permissions under this License.++ 8. Limitation of Liability. In no event and under no legal theory,+ whether in tort (including negligence), contract, or otherwise,+ unless required by applicable law (such as deliberate and grossly+ negligent acts) or agreed to in writing, shall any Contributor be+ liable to You for damages, including any direct, indirect, special,+ incidental, or consequential damages of any character arising as a+ result of this License or out of the use or inability to use the+ Work (including but not limited to damages for loss of goodwill,+ work stoppage, computer failure or malfunction, or any and all+ other commercial damages or losses), even if such Contributor+ has been advised of the possibility of such damages.++ 9. Accepting Warranty or Additional Liability. While redistributing+ the Work or Derivative Works thereof, You may choose to offer,+ and charge a fee for, acceptance of support, warranty, indemnity,+ or other liability obligations and/or rights consistent with this+ License. However, in accepting such obligations, You may act only+ on Your own behalf and on Your sole responsibility, not on behalf+ of any other Contributor, and only if You agree to indemnify,+ defend, and hold each Contributor harmless for any liability+ incurred by, or claims asserted against, such Contributor by reason+ of your accepting any such warranty or additional liability.++ END OF TERMS AND CONDITIONS++ APPENDIX: How to apply the Apache License to your work.++ To apply the Apache License to your work, attach the following+ boilerplate notice, with the fields enclosed by brackets "[]"+ replaced with your own identifying information. (Don't include+ the brackets!) The text should be enclosed in the appropriate+ comment syntax for the file format. We also recommend that a+ file or class name and description of purpose be included on the+ same "printed page" as the copyright notice for easier+ identification within third-party archives.++ Copyright [yyyy] [name of copyright owner]++ Licensed under the Apache License, Version 2.0 (the "License");+ you may not use this file except in compliance with the License.+ You may obtain a copy of the License at++ http://www.apache.org/licenses/LICENSE-2.0++ Unless required by applicable law or agreed to in writing, software+ distributed under the License is distributed on an "AS IS" BASIS,+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+ See the License for the specific language governing permissions and+ limitations under the License.
+ Setup.lhs view
@@ -0,0 +1,6 @@+#!/usr/bin/env runhaskell++> import Distribution.Simple++> main = defaultMain+
+ convert.cabal view
@@ -0,0 +1,56 @@+name: convert+version: 1.0+synopsis: Safe and unsafe data conversion utilities with strong type-level operation. checking.+-- description: +license: Apache-2.0+license-file: LICENSE+author: Wojciech Danilo+maintainer: Wojciech Danilo <wojciech.danilo@gmail.com>+stability: experimental+homepage: https://github.com/wdanilo/convert+bug-reports: https://github.com/wdanilo/convert/issues+copyright: Copyright (C) 2015 Wojciech Danilo+category: Data+build-type: Simple+-- extra-source-files: +cabal-version: >=1.10+++flag dump-splices+ default: False+ manual: True++library+ Build-Depends: base>=3 && <5,+ old-time,+ time>=1.1.3,+ bytestring >= 0.10.2,+ containers,+ old-locale,+ mtl,+ text >= 0.8,+ either,+ template-haskell,+ lens++ GHC-Options: -O2 -Wall -fno-warn-orphans+ default-language: Haskell2010++++ Exposed-Modules: Data.Convert,+ Data.Convert.Base,+ Data.Convert.Bound,+ Data.Convert.Errors,+ Data.Convert.Instances,+ Data.Convert.Instances.Map,+ Data.Convert.Instances.Num,+ Data.Convert.Instances.Text,+ Data.Convert.Instances.TH++ default-extensions: MultiParamTypeClasses,+ UndecidableInstances, FlexibleInstances,+ FlexibleContexts, CPP+++