text-builder-lawful-conversions (empty) → 0.1
raw patch · 12 files changed
+445/−0 lines, 12 filesdep +QuickCheckdep +basedep +hspec
Dependencies added: QuickCheck, base, hspec, lawful-conversions, quickcheck-instances, text, text-builder, text-builder-core, text-builder-lawful-conversions
Files
- LICENSE +22/−0
- src/hspec/Main.hs +37/−0
- src/hspec/Main/Conversions/StrictBuilder.hs +40/−0
- src/hspec/Main/Conversions/StrictTextBuilder.hs +40/−0
- src/hspec/Main/LawfulConversionsHspec.hs +38/−0
- src/library/TextBuilderLawfulConversions.hs +7/−0
- src/library/TextBuilderLawfulConversions/LazyBuilder.hs +22/−0
- src/library/TextBuilderLawfulConversions/LazyText.hs +22/−0
- src/library/TextBuilderLawfulConversions/StrictBuilder.hs +41/−0
- src/library/TextBuilderLawfulConversions/StrictText.hs +21/−0
- src/library/TextBuilderLawfulConversions/StrictTextBuilder.hs +41/−0
- text-builder-lawful-conversions.cabal +114/−0
+ LICENSE view
@@ -0,0 +1,22 @@+Copyright (c) 2025, Nikita Volkov++Permission is hereby granted, free of charge, to any person+obtaining a copy of this software and associated documentation+files (the "Software"), to deal in the Software without+restriction, including without limitation the rights to use,+copy, modify, merge, publish, distribute, sublicense, and/or sell+copies of the Software, and to permit persons to whom the+Software is furnished to do so, subject to the following+conditions:++The above copyright notice and this permission notice shall be+included in all copies or substantial portions of the Software.++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR+OTHER DEALINGS IN THE SOFTWARE.
+ src/hspec/Main.hs view
@@ -0,0 +1,37 @@+{-# OPTIONS_GHC -Wno-orphans #-}++module Main (main) where++import Data.Proxy (Proxy (..))+import qualified Data.Text+import qualified Data.Text.Lazy+import qualified Data.Text.Lazy.Builder+import qualified Main.Conversions.StrictBuilder+import qualified Main.Conversions.StrictTextBuilder+import Main.LawfulConversionsHspec+import Test.Hspec+import Test.QuickCheck.Arbitrary+import Test.QuickCheck.Instances ()+import TextBuilder (TextBuilder)+import TextBuilderLawfulConversions ()+import Prelude++main :: IO ()+main = hspec do+ describe "Data.Text.Text" do+ allIs (Proxy @Data.Text.Text) (Proxy @TextBuilder)++ describe "Data.Text.Lazy.Text" do+ allIs (Proxy @Data.Text.Lazy.Text) (Proxy @TextBuilder)++ describe "Data.Text.Lazy.Builder.Builder" do+ allIs (Proxy @Data.Text.Lazy.Builder.Builder) (Proxy @TextBuilder)++ describe "Data.Text.Encoding.StrictBuilder" do+ Main.Conversions.StrictBuilder.spec++ describe "Data.Text.Encoding.StrictTextBuilder" do+ Main.Conversions.StrictTextBuilder.spec++instance Arbitrary Data.Text.Lazy.Builder.Builder where+ arbitrary = Data.Text.Lazy.Builder.fromText <$> arbitrary
+ src/hspec/Main/Conversions/StrictBuilder.hs view
@@ -0,0 +1,40 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -Wno-orphans #-}++module Main.Conversions.StrictBuilder (spec) where++#if MIN_VERSION_text(2,0,2) && !MIN_VERSION_text(2,1,2)++import Data.Function+import Data.Proxy+import qualified Data.Text.Encoding as TextEncoding+import Main.LawfulConversionsHspec+import Test.Hspec+import Test.QuickCheck.Arbitrary+import TextBuilder (TextBuilder)+import Prelude++spec :: Spec+spec = allIs (Proxy @TextBuilder) (Proxy @TextEncoding.StrictBuilder)++instance Eq TextEncoding.StrictBuilder where+ a == b =+ on (==) TextEncoding.strictBuilderToText a b++instance Show TextEncoding.StrictBuilder where+ showsPrec d =+ showsPrec d . TextEncoding.strictBuilderToText++instance Arbitrary TextEncoding.StrictBuilder where+ arbitrary =+ TextEncoding.textToStrictBuilder <$> arbitrary++#else++import Test.Hspec+import Prelude++spec :: Spec+spec = pure ()++#endif
+ src/hspec/Main/Conversions/StrictTextBuilder.hs view
@@ -0,0 +1,40 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -Wno-orphans #-}++module Main.Conversions.StrictTextBuilder (spec) where++#if MIN_VERSION_text(2,1,2)++import Data.Function+import Data.Proxy+import qualified Data.Text.Encoding as TextEncoding+import Main.LawfulConversionsHspec+import Test.Hspec+import Test.QuickCheck.Arbitrary+import TextBuilder (TextBuilder)+import Prelude++spec :: Spec+spec = allIs (Proxy @TextBuilder) (Proxy @TextEncoding.StrictTextBuilder)++instance Eq TextEncoding.StrictTextBuilder where+ a == b =+ on (==) TextEncoding.strictBuilderToText a b++instance Show TextEncoding.StrictTextBuilder where+ showsPrec d =+ showsPrec d . TextEncoding.strictBuilderToText++instance Arbitrary TextEncoding.StrictTextBuilder where+ arbitrary =+ TextEncoding.textToStrictBuilder <$> arbitrary++#else++import Test.Hspec+import Prelude++spec :: Spec+spec = pure ()++#endif
+ src/hspec/Main/LawfulConversionsHspec.hs view
@@ -0,0 +1,38 @@+module Main.LawfulConversionsHspec where++import Control.Monad (forM_)+import Data.Proxy (Proxy (..))+import qualified LawfulConversions+import Test.Hspec+import Test.Hspec.QuickCheck+import Test.QuickCheck (Arbitrary)+import Test.QuickCheck.Instances ()+import TextBuilderLawfulConversions ()+import Prelude++isSome :: (LawfulConversions.IsSome a b, Eq a, Eq b, Show a, Show b, Arbitrary b) => Proxy a -> Proxy b -> Spec+isSome a b = describe "IsSome" do+ forM_ (LawfulConversions.isSomeProperties a b) \(name, property) ->+ prop name property++isMany :: (LawfulConversions.IsMany a b, Eq a, Eq b, Show a, Show b, Arbitrary b) => Proxy a -> Proxy b -> Spec+isMany a b = describe "IsMany" do+ forM_ (LawfulConversions.isManyProperties a b) \(name, property) ->+ prop name property++is :: (LawfulConversions.Is a b, Eq a, Eq b, Show a, Show b, Arbitrary a, Arbitrary b) => Proxy a -> Proxy b -> Spec+is a b = describe "Is" do+ forM_ (LawfulConversions.isProperties a b) \(name, property) ->+ prop name property++allIs :: (LawfulConversions.Is a b, Eq a, Eq b, Show a, Show b, Arbitrary a, Arbitrary b) => Proxy a -> Proxy b -> Spec+allIs a b = do+ describe "Forward" do+ isSome a b+ isMany a b+ is a b++ describe "Backward" do+ isSome b a+ isMany b a+ is b a
+ src/library/TextBuilderLawfulConversions.hs view
@@ -0,0 +1,7 @@+module TextBuilderLawfulConversions () where++import TextBuilderLawfulConversions.LazyBuilder ()+import TextBuilderLawfulConversions.LazyText ()+import TextBuilderLawfulConversions.StrictBuilder ()+import TextBuilderLawfulConversions.StrictText ()+import TextBuilderLawfulConversions.StrictTextBuilder ()
+ src/library/TextBuilderLawfulConversions/LazyBuilder.hs view
@@ -0,0 +1,22 @@+{-# OPTIONS_GHC -Wno-orphans #-}++module TextBuilderLawfulConversions.LazyBuilder where++import qualified Data.Text.Lazy.Builder+import LawfulConversions+import TextBuilder+import Prelude++instance IsSome Data.Text.Lazy.Builder.Builder TextBuilder where+ to = Data.Text.Lazy.Builder.fromText . toText++instance IsSome TextBuilder Data.Text.Lazy.Builder.Builder where+ to = lazyText . Data.Text.Lazy.Builder.toLazyText++instance IsMany Data.Text.Lazy.Builder.Builder TextBuilder++instance IsMany TextBuilder Data.Text.Lazy.Builder.Builder++instance Is Data.Text.Lazy.Builder.Builder TextBuilder++instance Is TextBuilder Data.Text.Lazy.Builder.Builder
+ src/library/TextBuilderLawfulConversions/LazyText.hs view
@@ -0,0 +1,22 @@+{-# OPTIONS_GHC -Wno-orphans #-}++module TextBuilderLawfulConversions.LazyText where++import qualified Data.Text.Lazy+import LawfulConversions+import TextBuilder+import Prelude++instance IsSome Data.Text.Lazy.Text TextBuilder where+ to = to . toText++instance IsSome TextBuilder Data.Text.Lazy.Text where+ to = lazyText++instance IsMany Data.Text.Lazy.Text TextBuilder++instance IsMany TextBuilder Data.Text.Lazy.Text++instance Is Data.Text.Lazy.Text TextBuilder++instance Is TextBuilder Data.Text.Lazy.Text
+ src/library/TextBuilderLawfulConversions/StrictBuilder.hs view
@@ -0,0 +1,41 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -Wno-orphans #-}++module TextBuilderLawfulConversions.StrictBuilder where++#if MIN_VERSION_text(2,0,2) && !MIN_VERSION_text(2,1,2)++import Data.Functor+import Data.Text.Internal.StrictBuilder+import LawfulConversions+import TextBuilder (TextBuilder)+import qualified TextBuilderCore+import Prelude++instance IsSome StrictBuilder TextBuilder where+ {-# INLINE to #-}+ to (TextBuilderCore.TextBuilder size write) =+ StrictBuilder+ size+ ( \array offset ->+ write array offset $> ()+ )++instance IsSome TextBuilder StrictBuilder where+ {-# INLINE to #-}+ to (StrictBuilder size write) =+ TextBuilderCore.TextBuilder+ size+ ( \array offset ->+ write array offset $> offset + size+ )++instance IsMany StrictBuilder TextBuilder++instance IsMany TextBuilder StrictBuilder++instance Is StrictBuilder TextBuilder++instance Is TextBuilder StrictBuilder++#endif
+ src/library/TextBuilderLawfulConversions/StrictText.hs view
@@ -0,0 +1,21 @@+{-# OPTIONS_GHC -Wno-orphans #-}++module TextBuilderLawfulConversions.StrictText where++import qualified Data.Text+import LawfulConversions+import TextBuilder++instance IsSome Data.Text.Text TextBuilder where+ to = toText++instance IsSome TextBuilder Data.Text.Text where+ to = text++instance IsMany Data.Text.Text TextBuilder++instance IsMany TextBuilder Data.Text.Text++instance Is Data.Text.Text TextBuilder++instance Is TextBuilder Data.Text.Text
+ src/library/TextBuilderLawfulConversions/StrictTextBuilder.hs view
@@ -0,0 +1,41 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -Wno-orphans #-}++module TextBuilderLawfulConversions.StrictTextBuilder where++#if MIN_VERSION_text(2,1,2)++import Data.Functor+import Data.Text.Internal.StrictBuilder+import LawfulConversions+import TextBuilder (TextBuilder)+import qualified TextBuilderCore+import Prelude++instance IsSome StrictTextBuilder TextBuilder where+ {-# INLINE to #-}+ to (TextBuilderCore.TextBuilder size write) =+ StrictTextBuilder+ size+ ( \array offset ->+ write array offset $> ()+ )++instance IsSome TextBuilder StrictTextBuilder where+ {-# INLINE to #-}+ to (StrictTextBuilder size write) =+ TextBuilderCore.TextBuilder+ size+ ( \array offset ->+ write array offset $> offset + size+ )++instance IsMany StrictTextBuilder TextBuilder++instance IsMany TextBuilder StrictTextBuilder++instance Is StrictTextBuilder TextBuilder++instance Is TextBuilder StrictTextBuilder++#endif
+ text-builder-lawful-conversions.cabal view
@@ -0,0 +1,114 @@+cabal-version: 3.0+name: text-builder-lawful-conversions+version: 0.1+category: Text, Builders, Conversions+synopsis: Orphan instances of "lawful-conversions" for "text-builder"+homepage: https://github.com/nikita-volkov/text-builder-lawful-conversions+bug-reports: https://github.com/nikita-volkov/text-builder-lawful-conversions/issues+author: Nikita Volkov <nikita.y.volkov@mail.ru>+maintainer: Nikita Volkov <nikita.y.volkov@mail.ru>+copyright: (c) 2025, Nikita Volkov+license: MIT+license-file: LICENSE++source-repository head+ type: git+ location: https://github.com/nikita-volkov/text-builder-lawful-conversions++common base+ default-language: Haskell2010+ default-extensions:+ BangPatterns+ BlockArguments+ ConstraintKinds+ DataKinds+ DefaultSignatures+ DeriveDataTypeable+ DeriveFoldable+ DeriveFunctor+ DeriveGeneric+ DeriveTraversable+ DerivingStrategies+ EmptyDataDecls+ FlexibleContexts+ FlexibleInstances+ FunctionalDependencies+ GADTs+ GeneralizedNewtypeDeriving+ LambdaCase+ LiberalTypeSynonyms+ MagicHash+ MultiParamTypeClasses+ MultiWayIf+ NoImplicitPrelude+ NoMonomorphismRestriction+ NumericUnderscores+ OverloadedStrings+ ParallelListComp+ PatternGuards+ QuasiQuotes+ RankNTypes+ RecordWildCards+ ScopedTypeVariables+ StandaloneDeriving+ StrictData+ TemplateHaskell+ TupleSections+ TypeApplications+ TypeFamilies+ TypeOperators+ UnboxedTuples+ ViewPatterns++common executable+ import: base+ ghc-options:+ -O2+ -threaded+ "-with-rtsopts=-N -I0 -qg"++common test+ import: base+ ghc-options:+ -threaded+ "-with-rtsopts=-N -I0 -qg"++library+ import: base+ hs-source-dirs: src/library+ exposed-modules:+ TextBuilderLawfulConversions++ other-modules:+ TextBuilderLawfulConversions.LazyBuilder+ TextBuilderLawfulConversions.LazyText+ TextBuilderLawfulConversions.StrictBuilder+ TextBuilderLawfulConversions.StrictText+ TextBuilderLawfulConversions.StrictTextBuilder++ build-depends:+ base >=4.13 && <5,+ lawful-conversions ^>=0.1.7,+ text >=1.2 && <3,+ text-builder ^>=1.0.0.1,+ text-builder-core ^>=0.1.1.1,++test-suite hspec+ import: test+ type: exitcode-stdio-1.0+ hs-source-dirs: src/hspec+ main-is: Main.hs+ other-modules:+ Main.Conversions.StrictBuilder+ Main.Conversions.StrictTextBuilder+ Main.LawfulConversionsHspec++ build-depends:+ QuickCheck >=2.15 && <3,+ base,+ hspec >=2.11 && <3,+ lawful-conversions,+ quickcheck-instances ^>=0.3.32,+ text,+ text-builder,+ text-builder-lawful-conversions,