packages feed

lawful-conversions 0.1.7 → 0.2

raw patch · 70 files changed

+256/−238 lines, 70 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- LawfulConversions: isManyProperties :: (IsMany a b, Eq a, Eq b, Show a, Show b, Arbitrary b) => Proxy a -> Proxy b -> [(String, Property)]
+ LawfulConversions: isManyProperties :: (IsMany a b, Eq a, Eq b, Show a, Show b, Arbitrary a, Arbitrary b) => Proxy a -> Proxy b -> [(String, Property)]

Files

CHANGELOG.md view
@@ -0,0 +1,5 @@+# v0.2++## Breaking++- Added more tests in `isManyProperties` and an `Arbitrary` constraint on its parameter `a`
lawful-conversions.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: lawful-conversions-version: 0.1.7+version: 0.2 synopsis: Lawful typeclasses for bidirectional conversion between types category: Conversion homepage: https://github.com/nikita-volkov/lawful-conversions@@ -50,6 +50,8 @@   evident what any of its instances do and it provides property-tests for you   to validate your instances. +  The laws and the concepts are based on set and category theories.+   = Prior work and acknowledgements    This library is an offspring of the "[isomorphism-class](https://hackage.haskell.org/package/isomorphism-class)" library, expanding upon the patterns discovered there. Both libraries are maintained letting their designs compete.@@ -83,7 +85,7 @@   hs-source-dirs: src/library   exposed-modules: LawfulConversions   other-modules:-    LawfulConversions.Classes+    LawfulConversions.Algebra     LawfulConversions.Optics     LawfulConversions.Prelude     LawfulConversions.Properties
src/library/LawfulConversions.hs view
@@ -105,7 +105,7 @@   ) where -import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Optics import LawfulConversions.Properties import LawfulConversions.Proxies
+ src/library/LawfulConversions/Algebra.hs view
@@ -0,0 +1,158 @@+module LawfulConversions.Algebra where++import LawfulConversions.Prelude++-- |+-- Evidence that all values of type @b@ form a subset of all values of type @a@.+--+-- [From Wikipedia](https://en.wikipedia.org/wiki/Subset):+--+-- In mathematics, a set A is a subset of a set B if all elements of A are also elements of B; B is then a superset of A. It is possible for A and B to be equal; if they are unequal, then A is a proper subset of B. The relationship of one set being a subset of another is called inclusion (or sometimes containment). A is a subset of B may also be expressed as B includes (or contains) A or A is included (or contained) in B. A k-subset is a subset with k elements.+--+-- === Laws+--+-- ==== 'to' is [injective](https://en.wikipedia.org/wiki/Injective_function)+--+-- For every two values of type @b@ that are not equal converting with 'to' produces values that are not equal as well:+--+-- > \(b1, b2) -> b1 == b2 || to @a b1 /= to @a b2+--+-- ==== 'maybeFrom' is a [partial inverse](https://en.wikipedia.org/wiki/Inverse_function#Partial_inverses) of 'to'+--+-- For all values of @b@ converting to @a@ and then attempting to convert back to @b@ always succeeds and produces a value that is equal to the original:+--+-- > \b -> maybeFrom (to @a b) == Just b+--+-- === Testing+--+-- For testing whether your instances conform to these laws use 'LawfulConversions.isSomeProperties'.+class IsSome a b where+  -- |+  -- Convert a value of a subset type to a superset type.+  to :: b -> a++  -- |+  -- [Partial inverse](https://en.wikipedia.org/wiki/Inverse_function#Partial_inverses) of 'to'.+  maybeFrom :: a -> Maybe b++  -- |+  -- Requires the presence of 'IsSome' in reverse direction.+  default maybeFrom :: (IsSome b a) => a -> Maybe b+  maybeFrom = Just . to++-- | Every type is isomorphic to itself.+instance IsSome a a where+  to = id+  maybeFrom = Just . id++-- | The empty set has no elements, and therefore is vacuously a subset of any set.+instance IsSome a Void where+  to = absurd+  maybeFrom = const Nothing++-- |+-- Lossy or canonicalizing conversion.+-- Captures mappings from multiple alternative inputs into one output.+--+-- E.g.,+--+-- - `ByteString` can be decoded into `Text` with UTF-8 leniently, replacing the invalid chars with a default char.+--+-- - `String` has a wider range of supported chars than `Text`, so some chars get replaced too.+--+-- === Laws+--+-- ==== 'from' is an [inverse](https://en.wikipedia.org/wiki/Inverse_function) of 'to'+--+-- > \b -> b == from (to @a b)+--+-- === Testing+--+-- For testing whether your instances conform to these laws use 'LawfulConversions.isManyProperties'.+class (IsSome a b) => IsMany a b where+  -- |+  -- Possibly lossy inverse of 'to'.+  -- [Surjection](https://en.wikipedia.org/wiki/Surjective_function) from @a@ to @b@.+  --+  -- Particularly useful in combination with the @TypeApplications@ extension,+  -- where it allows to specify the input type, e.g.:+  --+  -- > fromText :: IsMany Text b => Text -> b+  -- > fromText = from @Text+  --+  -- The first type application of the 'to' function on the other hand specifies+  -- the output data type.+  --+  -- If you want to specify the output type instead, use 'onto'.+  from :: a -> b++  -- |+  -- Requires the presence of 'IsSome' in reverse direction.+  default from :: (IsSome b a) => a -> b+  from = to++-- |+-- Alias to 'from', which lets you specify the target type of the conversion first using @TypeApplications@.+--+-- In mathematics @onto@ is another name for [Surjective function](https://en.wikipedia.org/wiki/Surjective_function).+--+-- E.g.,+--+-- > lenientDecodeUtf8 = onto @Text+onto :: forall b a. (IsMany a b) => a -> b+onto = from++instance IsMany a a++-- | Bidirectional conversion between two types with no loss of information.+--+-- The bidirectionality is encoded via a recursive dependency with arguments+-- flipped.+--+-- You can read the signature @Is a b@ as \"/B/ is /A/\".+--+-- === Laws+--+-- ==== 'from' is an [inverse](https://en.wikipedia.org/wiki/Inverse_function) of 'to'+--+-- For all values of /b/ converting from /b/ to /a/ and then converting from /a/ to /b/ produces the original value:+--+-- > \b -> b == from (to @a b)+--+-- ==== 'to' is an [inverse](https://en.wikipedia.org/wiki/Inverse_function) of 'from'+--+-- For all values of /a/ converting from /a/ to /b/ and then converting from /b/ to /a/ produces the original value:+--+-- > \a -> a == to (from @a @b a)+--+-- === Testing+--+-- For testing whether your instances conform to these laws use 'LawfulConversions.isProperties'.+--+-- === Instance Definition+--+-- For each pair of isomorphic types (/A/ and /B/) the compiler will require you to define six instances, namely: @Is A B@ and @Is B A@, @IsMany A B@ and @IsMany B A@, @IsSome A B@ and @IsSome B A@.+--+-- Instances of @Is@ do not define any functions and serve merely as a statement that the laws are satisfied.+--+-- ==== Example: Lazy Text and Text+--+-- @+-- instance IsSome "Data.Text.Lazy.LazyText" "Data.Text.Text" where+--   to = LazyText.'Data.Text.Lazy.fromStrict'+--+-- instance IsSome "Data.Text.Text" "Data.Text.Lazy.LazyText" where+--   to = LazyText.'Data.Text.Lazy.toStrict'+--+-- instance IsMany "Data.Text.Lazy.LazyText" "Data.Text.Text"+--+-- instance IsMany "Data.Text.Text" "Data.Text.Lazy.LazyText"+--+-- instance Is "Data.Text.Lazy.LazyText" "Data.Text.Text"+--+-- instance Is "Data.Text.Text" "Data.Text.Lazy.LazyText"+-- @+class (IsMany a b, Is b a) => Is a b++-- | Any type is isomorphic to itself.+instance Is a a
− src/library/LawfulConversions/Classes.hs
@@ -1,158 +0,0 @@-module LawfulConversions.Classes where--import LawfulConversions.Prelude---- |--- Evidence that all values of type @b@ form a subset of all values of type @a@.------ [From Wikipedia](https://en.wikipedia.org/wiki/Subset):------ In mathematics, a set A is a subset of a set B if all elements of A are also elements of B; B is then a superset of A. It is possible for A and B to be equal; if they are unequal, then A is a proper subset of B. The relationship of one set being a subset of another is called inclusion (or sometimes containment). A is a subset of B may also be expressed as B includes (or contains) A or A is included (or contained) in B. A k-subset is a subset with k elements.------ === Laws------ ==== 'to' is [injective](https://en.wikipedia.org/wiki/Injective_function)------ For every two values of type @b@ that are not equal converting with 'to' produces values that are not equal as well:------ > \(b1, b2) -> b1 == b2 || to @a b1 /= to @a b2------ ==== 'maybeFrom' is a [partial inverse](https://en.wikipedia.org/wiki/Inverse_function#Partial_inverses) of 'to'------ For all values of @b@ converting to @a@ and then attempting to convert back to @b@ always succeeds and produces a value that is equal to the original:------ > \b -> maybeFrom (to @a b) == Just b------ === Testing------ For testing whether your instances conform to these laws use 'LawfulConversions.isSomeProperties'.-class IsSome a b where-  -- |-  -- Convert a value of a subset type to a superset type.-  to :: b -> a--  -- |-  -- [Partial inverse](https://en.wikipedia.org/wiki/Inverse_function#Partial_inverses) of 'to'.-  maybeFrom :: a -> Maybe b--  -- |-  -- Requires the presence of 'IsSome' in reverse direction.-  default maybeFrom :: (IsSome b a) => a -> Maybe b-  maybeFrom = Just . to---- | Every type is isomorphic to itself.-instance IsSome a a where-  to = id-  maybeFrom = Just . id---- | The empty set has no elements, and therefore is vacuously a subset of any set.-instance IsSome a Void where-  to = absurd-  maybeFrom = const Nothing---- |--- Lossy or canonicalizing conversion.--- Captures mappings from multiple alternative inputs into one output.------ E.g.,------ - `ByteString` can be decoded into `Text` with UTF-8 leniently, replacing the invalid chars with a default char.------ - `String` has a wider range of supported chars than `Text`, so some chars get replaced too.------ === Laws------ ==== 'from' is an [inverse](https://en.wikipedia.org/wiki/Inverse_function) of 'to'------ > \b -> b == from (to @a b)------ === Testing------ For testing whether your instances conform to these laws use 'LawfulConversions.isManyProperties'.-class (IsSome a b) => IsMany a b where-  -- |-  -- Possibly lossy inverse of 'to'.-  -- [Surjection](https://en.wikipedia.org/wiki/Surjective_function) from @a@ to @b@.-  ---  -- Particularly useful in combination with the @TypeApplications@ extension,-  -- where it allows to specify the input type, e.g.:-  ---  -- > fromText :: IsMany Text b => Text -> b-  -- > fromText = from @Text-  ---  -- The first type application of the 'to' function on the other hand specifies-  -- the output data type.-  ---  -- If you want to specify the output type instead, use 'onto'.-  from :: a -> b--  -- |-  -- Requires the presence of 'IsSome' in reverse direction.-  default from :: (IsSome b a) => a -> b-  from = to---- |--- Alias to 'from', which lets you specify the target type of the conversion first using @TypeApplications@.------ In mathematics @onto@ is another name for [Surjective function](https://en.wikipedia.org/wiki/Surjective_function).------ E.g.,------ > lenientDecodeUtf8 = onto @Text-onto :: forall b a. (IsMany a b) => a -> b-onto = from--instance IsMany a a---- | Bidirectional conversion between two types with no loss of information.------ The bidirectionality is encoded via a recursive dependency with arguments--- flipped.------ You can read the signature @Is a b@ as \"/B/ is /A/\".------ === Laws------ ==== 'from' is an [inverse](https://en.wikipedia.org/wiki/Inverse_function) of 'to'------ For all values of /b/ converting from /b/ to /a/ and then converting from /a/ to /b/ produces the original value:------ > \b -> b == from (to @a b)------ ==== 'to' is an [inverse](https://en.wikipedia.org/wiki/Inverse_function) of 'from'------ For all values of /a/ converting from /a/ to /b/ and then converting from /b/ to /a/ produces the original value:------ > \a -> a == to (from @a @b a)------ === Testing------ For testing whether your instances conform to these laws use 'LawfulConversions.isProperties'.------ === Instance Definition------ For each pair of isomorphic types (/A/ and /B/) the compiler will require you to define six instances, namely: @Is A B@ and @Is B A@, @IsMany A B@ and @IsMany B A@, @IsSome A B@ and @IsSome B A@.------ Instances of @Is@ do not define any functions and serve merely as a statement that the laws are satisfied.------ ==== Example: Lazy Text and Text------ @--- instance IsSome "Data.Text.Lazy.LazyText" "Data.Text.Text" where---   to = LazyText.'Data.Text.Lazy.fromStrict'------ instance IsSome "Data.Text.Text" "Data.Text.Lazy.LazyText" where---   to = LazyText.'Data.Text.Lazy.toStrict'------ instance IsMany "Data.Text.Lazy.LazyText" "Data.Text.Text"------ instance IsMany "Data.Text.Text" "Data.Text.Lazy.LazyText"------ instance Is "Data.Text.Lazy.LazyText" "Data.Text.Text"------ instance Is "Data.Text.Text" "Data.Text.Lazy.LazyText"--- @-class (IsMany a b, Is b a) => Is a b---- | Any type is isomorphic to itself.-instance Is a a
src/library/LawfulConversions/Optics.hs view
@@ -1,7 +1,7 @@ module LawfulConversions.Optics where  import Data.Profunctor-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  -- | Van-Laarhoven-style Prism, compatible with libraries like \"lens\" and \"optics\".
src/library/LawfulConversions/Properties.hs view
@@ -5,7 +5,7 @@   ) where -import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import Test.QuickCheck @@ -54,15 +54,26 @@ -- >       (uncurry prop) -- >       (isManyProperties @String @Text Proxy Proxy) isManyProperties ::-  (IsMany a b, Eq a, Eq b, Show a, Show b, Arbitrary b) =>+  (IsMany a b, Eq a, Eq b, Show a, Show b, Arbitrary a, Arbitrary b) =>   Proxy a ->   Proxy b ->   [(String, Property)] isManyProperties aProxy bProxy =-  ( "'from' is an inverse of 'to'",-    property \b -> b === from' (to' b)-  )-    : isSomeProperties aProxy bProxy+  [ ( "'from' is an inverse of 'to'",+      property \b -> b === from' (to' b)+    ),+    ( "'from' is consistent with 'maybeFrom'",+      property \a -> case maybeFrom a of+        Nothing -> property Discard+        Just b -> b === from' a+    ),+    ( "'to' after 'from' always succeeds with 'maybeFrom'",+      property \a ->+        let b = from' a+         in maybeFrom (to' b) === Just b+    )+  ]+    <> isSomeProperties aProxy bProxy   where     to' = as aProxy . to . as bProxy     from' = as bProxy . from . as aProxy
src/library/LawfulConversions/Proxies/ViaIsSome.hs view
@@ -1,6 +1,6 @@ module LawfulConversions.Proxies.ViaIsSome where -import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import qualified Test.QuickCheck as QuickCheck 
src/library/LawfulConversions/Relations/BoxedVectorAndList.hs view
@@ -3,7 +3,7 @@ module LawfulConversions.Relations.BoxedVectorAndList where  import qualified Data.Vector-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome (Vector a) [a] where
src/library/LawfulConversions/Relations/BoxedVectorAndSeq.hs view
@@ -4,7 +4,7 @@  import qualified Data.Sequence import qualified Data.Vector-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome (Vector a) (Seq a) where
src/library/LawfulConversions/Relations/ByteArrayAndByteString.hs view
@@ -4,7 +4,7 @@  import qualified Data.ByteString.Short import qualified Data.Primitive.ByteArray-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import LawfulConversions.Relations.ByteArrayAndShortByteString () import LawfulConversions.Relations.ByteStringAndShortByteString ()
src/library/LawfulConversions/Relations/ByteArrayAndLazyByteString.hs view
@@ -5,7 +5,7 @@ import qualified Data.ByteString.Lazy import qualified Data.ByteString.Short import qualified Data.Primitive.ByteArray-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import LawfulConversions.Relations.ByteArrayAndShortByteString () import LawfulConversions.Relations.LazyByteStringAndShortByteString ()
src/library/LawfulConversions/Relations/ByteArrayAndLazyByteStringBuilder.hs view
@@ -5,7 +5,7 @@ import qualified Data.ByteString.Builder import qualified Data.ByteString.Short import qualified Data.Primitive.ByteArray-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import LawfulConversions.Relations.ByteArrayAndShortByteString () import LawfulConversions.Relations.LazyByteStringBuilderAndShortByteString ()
src/library/LawfulConversions/Relations/ByteArrayAndShortByteString.hs view
@@ -5,7 +5,7 @@ import qualified Data.ByteString.Short import qualified Data.ByteString.Short.Internal import qualified Data.Primitive.ByteArray-import LawfulConversions.Classes+import LawfulConversions.Algebra  instance IsSome Data.ByteString.Short.ShortByteString Data.Primitive.ByteArray.ByteArray where   to (Data.Primitive.ByteArray.ByteArray array) =
src/library/LawfulConversions/Relations/ByteArrayAndTextArray.hs view
@@ -7,7 +7,7 @@  import qualified Data.Primitive.ByteArray import qualified Data.Text.Array-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import qualified LawfulConversions.TextCompat.Array 
src/library/LawfulConversions/Relations/ByteArrayAndWord8List.hs view
@@ -3,7 +3,7 @@ module LawfulConversions.Relations.ByteArrayAndWord8List where  import qualified Data.Primitive.ByteArray-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import LawfulConversions.Relations.ByteArrayAndShortByteString () 
src/library/LawfulConversions/Relations/ByteStringAndLazyByteString.hs view
@@ -3,7 +3,7 @@ module LawfulConversions.Relations.ByteStringAndLazyByteString where  import qualified Data.ByteString.Lazy-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome ByteString Data.ByteString.Lazy.ByteString where
src/library/LawfulConversions/Relations/ByteStringAndLazyByteStringBuilder.hs view
@@ -4,7 +4,7 @@  import qualified Data.ByteString.Builder import qualified Data.ByteString.Lazy-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome ByteString Data.ByteString.Builder.Builder where
src/library/LawfulConversions/Relations/ByteStringAndLazyText.hs view
@@ -6,7 +6,7 @@ import qualified Data.Text.Encoding.Error import qualified Data.Text.Lazy import qualified Data.Text.Lazy.Encoding-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  -- | UTF-8 codec.
src/library/LawfulConversions/Relations/ByteStringAndShortByteString.hs view
@@ -3,7 +3,7 @@ module LawfulConversions.Relations.ByteStringAndShortByteString where  import qualified Data.ByteString.Short-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome ByteString Data.ByteString.Short.ShortByteString where
src/library/LawfulConversions/Relations/ByteStringAndString.hs view
@@ -5,7 +5,7 @@ import qualified Data.Text import qualified Data.Text.Encoding import qualified Data.Text.Encoding.Error-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  -- | UTF-8 codec.
src/library/LawfulConversions/Relations/ByteStringAndText.hs view
@@ -4,7 +4,7 @@  import qualified Data.Text.Encoding import qualified Data.Text.Encoding.Error-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  -- | UTF-8 codec.
src/library/LawfulConversions/Relations/ByteStringAndTextArray.hs view
@@ -7,7 +7,7 @@  import qualified Data.ByteString.Short import qualified Data.Text.Array-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import qualified LawfulConversions.TextCompat.Array 
src/library/LawfulConversions/Relations/ByteStringAndWord8List.hs view
@@ -3,7 +3,7 @@ module LawfulConversions.Relations.ByteStringAndWord8List where  import qualified Data.ByteString-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome ByteString [Word8] where
src/library/LawfulConversions/Relations/DayAndLazyText.hs view
@@ -4,7 +4,7 @@  import qualified Data.Text.Lazy import Data.Time-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import LawfulConversions.Relations.DayAndString () import LawfulConversions.Relations.LazyTextAndString ()
src/library/LawfulConversions/Relations/DayAndLazyTextBuilder.hs view
@@ -4,7 +4,7 @@  import qualified Data.Text.Lazy.Builder import Data.Time-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import LawfulConversions.Relations.DayAndString () import LawfulConversions.Relations.LazyTextBuilderAndString ()
src/library/LawfulConversions/Relations/DayAndStrictTextBuilder.hs view
@@ -7,7 +7,7 @@  import qualified Data.Text.Encoding import Data.Time-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import LawfulConversions.Relations.StrictTextBuilderAndString () import LawfulConversions.Relations.StringAndText ()@@ -22,7 +22,7 @@  import qualified Data.Text.Encoding import Data.Time-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import LawfulConversions.Relations.StrictTextBuilderAndString () import LawfulConversions.Relations.StringAndText ()
src/library/LawfulConversions/Relations/DayAndString.hs view
@@ -4,7 +4,7 @@  import Data.Time import Data.Time.Format.ISO8601-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  -- | Implements ISO-8601.
src/library/LawfulConversions/Relations/DayAndText.hs view
@@ -3,7 +3,7 @@ module LawfulConversions.Relations.DayAndText where  import Data.Time-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import LawfulConversions.Relations.DayAndString () import LawfulConversions.Relations.StringAndText ()
src/library/LawfulConversions/Relations/Int16AndWord16.hs view
@@ -2,7 +2,7 @@  module LawfulConversions.Relations.Int16AndWord16 where -import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Int16 Word16 where
src/library/LawfulConversions/Relations/Int32AndWord32.hs view
@@ -2,7 +2,7 @@  module LawfulConversions.Relations.Int32AndWord32 where -import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Int32 Word32 where
src/library/LawfulConversions/Relations/Int64AndWord64.hs view
@@ -2,7 +2,7 @@  module LawfulConversions.Relations.Int64AndWord64 where -import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Int64 Word64 where
src/library/LawfulConversions/Relations/Int8AndWord8.hs view
@@ -2,7 +2,7 @@  module LawfulConversions.Relations.Int8AndWord8 where -import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Int8 Word8 where
src/library/LawfulConversions/Relations/IntAndWord.hs view
@@ -2,7 +2,7 @@  module LawfulConversions.Relations.IntAndWord where -import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Int Word where
src/library/LawfulConversions/Relations/IntMapAndMapOfInt.hs view
@@ -4,7 +4,7 @@  import qualified Data.IntMap.Strict import qualified Data.Map.Strict-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome (Map Int v) (IntMap v) where
src/library/LawfulConversions/Relations/IntSetAndSetOfInt.hs view
@@ -2,7 +2,7 @@  module LawfulConversions.Relations.IntSetAndSetOfInt where -import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome (Set Int) IntSet where
src/library/LawfulConversions/Relations/LazyByteStringAndLazyByteStringBuilder.hs view
@@ -4,7 +4,7 @@  import qualified Data.ByteString.Builder import qualified Data.ByteString.Lazy-import LawfulConversions.Classes+import LawfulConversions.Algebra  instance IsSome Data.ByteString.Lazy.ByteString Data.ByteString.Builder.Builder where   to = Data.ByteString.Builder.toLazyByteString
src/library/LawfulConversions/Relations/LazyByteStringAndLazyText.hs view
@@ -6,7 +6,7 @@ import qualified Data.Text.Encoding.Error import qualified Data.Text.Lazy import qualified Data.Text.Lazy.Encoding-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  -- | UTF-8 codec.
src/library/LawfulConversions/Relations/LazyByteStringAndShortByteString.hs view
@@ -4,7 +4,7 @@  import qualified Data.ByteString.Lazy import qualified Data.ByteString.Short-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Data.ByteString.Lazy.ByteString Data.ByteString.Short.ShortByteString where
src/library/LawfulConversions/Relations/LazyByteStringAndString.hs view
@@ -6,7 +6,7 @@ import qualified Data.Text.Encoding.Error import qualified Data.Text.Lazy import qualified Data.Text.Lazy.Encoding-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  -- | UTF-8 codec.
src/library/LawfulConversions/Relations/LazyByteStringAndText.hs view
@@ -7,7 +7,7 @@ import qualified Data.Text.Encoding.Error import qualified Data.Text.Lazy import qualified Data.Text.Lazy.Encoding-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  -- | UTF-8 codec.
src/library/LawfulConversions/Relations/LazyByteStringAndTextArray.hs view
@@ -8,7 +8,7 @@ import qualified Data.ByteString.Lazy import qualified Data.ByteString.Short import qualified Data.Text.Array-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import qualified LawfulConversions.TextCompat.Array 
src/library/LawfulConversions/Relations/LazyByteStringAndWord8List.hs view
@@ -3,7 +3,7 @@ module LawfulConversions.Relations.LazyByteStringAndWord8List where  import qualified Data.ByteString.Lazy-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Data.ByteString.Lazy.ByteString [Word8] where
src/library/LawfulConversions/Relations/LazyByteStringBuilderAndShortByteString.hs view
@@ -5,7 +5,7 @@ import qualified Data.ByteString.Builder import qualified Data.ByteString.Lazy import qualified Data.ByteString.Short-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Data.ByteString.Builder.Builder Data.ByteString.Short.ShortByteString where
src/library/LawfulConversions/Relations/LazyByteStringBuilderAndTextArray.hs view
@@ -9,7 +9,7 @@ import qualified Data.ByteString.Lazy import qualified Data.ByteString.Short import qualified Data.Text.Array-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import qualified LawfulConversions.TextCompat.Array 
src/library/LawfulConversions/Relations/LazyByteStringBuilderAndWord8List.hs view
@@ -4,7 +4,7 @@  import qualified Data.ByteString.Builder import qualified Data.ByteString.Lazy-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Data.ByteString.Builder.Builder [Word8] where
src/library/LawfulConversions/Relations/LazyTextAndLazyTextBuilder.hs view
@@ -4,7 +4,7 @@  import qualified Data.Text.Lazy import qualified Data.Text.Lazy.Builder-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Data.Text.Lazy.Text Data.Text.Lazy.Builder.Builder where
src/library/LawfulConversions/Relations/LazyTextAndStrictTextBuilder.hs view
@@ -7,7 +7,7 @@  import qualified Data.Text.Encoding import qualified Data.Text.Lazy-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Data.Text.Lazy.Text Data.Text.Encoding.StrictTextBuilder where@@ -28,7 +28,7 @@  import qualified Data.Text.Encoding import qualified Data.Text.Lazy-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Data.Text.Lazy.Text Data.Text.Encoding.StrictBuilder where
src/library/LawfulConversions/Relations/LazyTextAndString.hs view
@@ -3,7 +3,7 @@ module LawfulConversions.Relations.LazyTextAndString where  import qualified Data.Text.Lazy-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import LawfulConversions.Relations.StringAndText () 
src/library/LawfulConversions/Relations/LazyTextAndText.hs view
@@ -3,7 +3,7 @@ module LawfulConversions.Relations.LazyTextAndText where  import qualified Data.Text.Lazy-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Data.Text.Lazy.Text Text where
src/library/LawfulConversions/Relations/LazyTextAndUtcTime.hs view
@@ -4,7 +4,7 @@  import qualified Data.Text.Lazy import Data.Time-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import LawfulConversions.Relations.LazyTextAndString () import LawfulConversions.Relations.StringAndUtcTime ()
src/library/LawfulConversions/Relations/LazyTextAndUuid.hs view
@@ -4,7 +4,7 @@  import qualified Data.Text.Lazy import qualified Data.UUID.Types-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Data.Text.Lazy.Text UUID where
src/library/LawfulConversions/Relations/LazyTextBuilderAndStrictTextBuilder.hs view
@@ -8,7 +8,7 @@ import qualified Data.Text.Encoding import qualified Data.Text.Lazy import qualified Data.Text.Lazy.Builder-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Data.Text.Lazy.Builder.Builder Data.Text.Encoding.StrictTextBuilder where@@ -30,7 +30,7 @@ import qualified Data.Text.Encoding import qualified Data.Text.Lazy import qualified Data.Text.Lazy.Builder-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Data.Text.Lazy.Builder.Builder Data.Text.Encoding.StrictBuilder where
src/library/LawfulConversions/Relations/LazyTextBuilderAndString.hs view
@@ -4,7 +4,7 @@  import qualified Data.Text.Lazy import qualified Data.Text.Lazy.Builder-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import LawfulConversions.Relations.StringAndText () 
src/library/LawfulConversions/Relations/LazyTextBuilderAndText.hs view
@@ -4,7 +4,7 @@  import qualified Data.Text.Lazy import qualified Data.Text.Lazy.Builder-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Data.Text.Lazy.Builder.Builder Text where
src/library/LawfulConversions/Relations/LazyTextBuilderAndUtcTime.hs view
@@ -4,7 +4,7 @@  import qualified Data.Text.Lazy.Builder import Data.Time-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import LawfulConversions.Relations.LazyTextBuilderAndString () import LawfulConversions.Relations.StringAndUtcTime ()
src/library/LawfulConversions/Relations/LazyTextBuilderAndUuid.hs view
@@ -5,7 +5,7 @@ import qualified Data.Text.Lazy import qualified Data.Text.Lazy.Builder import qualified Data.UUID.Types-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Data.Text.Lazy.Builder.Builder UUID where
src/library/LawfulConversions/Relations/ListAndSeq.hs view
@@ -3,7 +3,7 @@ module LawfulConversions.Relations.ListAndSeq where  import qualified Data.Sequence-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome [a] (Seq a) where
src/library/LawfulConversions/Relations/ShortByteStringAndTextArray.hs view
@@ -7,7 +7,7 @@  import qualified Data.ByteString.Short import qualified Data.Text.Array-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import qualified LawfulConversions.TextCompat.Array 
src/library/LawfulConversions/Relations/ShortByteStringAndWord8List.hs view
@@ -3,7 +3,7 @@ module LawfulConversions.Relations.ShortByteStringAndWord8List where  import qualified Data.ByteString.Short-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import LawfulConversions.Relations.ByteArrayAndShortByteString () 
src/library/LawfulConversions/Relations/StrictTextBuilderAndString.hs view
@@ -6,7 +6,7 @@ #if MIN_VERSION_text(2,1,2)  import qualified Data.Text.Encoding-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Relations.StringAndText () import LawfulConversions.Prelude @@ -20,7 +20,7 @@ #elif MIN_VERSION_text(2,0,2)  import qualified Data.Text.Encoding-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Relations.StringAndText () import LawfulConversions.Prelude 
src/library/LawfulConversions/Relations/StrictTextBuilderAndText.hs view
@@ -6,7 +6,7 @@ #if MIN_VERSION_text(2,1,2)  import qualified Data.Text.Encoding-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Text Data.Text.Encoding.StrictTextBuilder where@@ -26,7 +26,7 @@ #elif MIN_VERSION_text(2,0,2)  import qualified Data.Text.Encoding-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Text Data.Text.Encoding.StrictBuilder where
src/library/LawfulConversions/Relations/StrictTextBuilderAndUtcTime.hs view
@@ -7,7 +7,7 @@  import qualified Data.Text.Encoding import Data.Time-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import LawfulConversions.Relations.StrictTextBuilderAndString () import LawfulConversions.Relations.StringAndText ()@@ -22,7 +22,7 @@  import qualified Data.Text.Encoding import Data.Time-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import LawfulConversions.Relations.StrictTextBuilderAndString () import LawfulConversions.Relations.StringAndText ()
src/library/LawfulConversions/Relations/StrictTextBuilderAndUuid.hs view
@@ -7,7 +7,7 @@  import qualified Data.UUID.Types import qualified Data.Text.Encoding-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Data.Text.Encoding.StrictTextBuilder UUID where@@ -18,7 +18,7 @@  import qualified Data.UUID.Types import qualified Data.Text.Encoding-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Data.Text.Encoding.StrictBuilder UUID where
src/library/LawfulConversions/Relations/StringAndText.hs view
@@ -3,7 +3,7 @@ module LawfulConversions.Relations.StringAndText where  import qualified Data.Text as Text-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome String Text where
src/library/LawfulConversions/Relations/StringAndUtcTime.hs view
@@ -4,7 +4,7 @@  import Data.Time import Data.Time.Format.ISO8601-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  -- | Implements ISO-8601.
src/library/LawfulConversions/Relations/StringAndUuid.hs view
@@ -3,7 +3,7 @@ module LawfulConversions.Relations.StringAndUuid where  import qualified Data.UUID.Types-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome String UUID where
src/library/LawfulConversions/Relations/TextAndUtcTime.hs view
@@ -3,7 +3,7 @@ module LawfulConversions.Relations.TextAndUtcTime where  import Data.Time-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import LawfulConversions.Relations.StringAndText () import LawfulConversions.Relations.StringAndUtcTime ()
src/library/LawfulConversions/Relations/TextAndUuid.hs view
@@ -3,7 +3,7 @@ module LawfulConversions.Relations.TextAndUuid where  import qualified Data.UUID.Types as Uuid-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude  instance IsSome Text UUID where
src/library/LawfulConversions/Relations/TextArrayAndWord8List.hs view
@@ -7,7 +7,7 @@  import qualified Data.ByteString.Short import qualified Data.Text.Array-import LawfulConversions.Classes+import LawfulConversions.Algebra import LawfulConversions.Prelude import qualified LawfulConversions.TextCompat.Array