describe 0.3.0.1 → 0.3.1.0
raw patch · 5 files changed
+50/−1 lines, 5 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Data.Serialize.Describe.Class: instance Data.Serialize.Describe.Class.Describe GHC.Types.Char
+ Data.Serialize.Describe.Combinators.NText: NText :: Text -> NText
+ Data.Serialize.Describe.Combinators.NText: [unwrapNText] :: NText -> Text
+ Data.Serialize.Describe.Combinators.NText: instance Data.Serialize.Describe.Class.Describe Data.Serialize.Describe.Combinators.NText.NText
+ Data.Serialize.Describe.Combinators.NText: instance Data.String.IsString Data.Serialize.Describe.Combinators.NText.NText
+ Data.Serialize.Describe.Combinators.NText: instance GHC.Show.Show Data.Serialize.Describe.Combinators.NText.NText
+ Data.Serialize.Describe.Combinators.NText: newtype NText
+ Data.Serialize.Describe.Combinators.NText: ntext :: (s -> Text) -> Descriptor s Text
Files
- CHANGELOG.md +4/−0
- describe.cabal +3/−1
- src/Data/Serialize/Describe/Class.hs +4/−0
- src/Data/Serialize/Describe/Combinators.hs +2/−0
- src/Data/Serialize/Describe/Combinators/NText.hs +37/−0
CHANGELOG.md view
@@ -2,6 +2,10 @@ ##0.3.0.1 -- 2020-01-09 +* Added NText combinator++##0.3.0.1 -- 2020-01-09+ * Added unexposed combinator modules ##0.3.0.0 -- 2020-01-09
describe.cabal view
@@ -3,7 +3,7 @@ -- For further documentation, see http://haskell.org/cabal/users-guide/ name: describe-version: 0.3.0.1+version: 0.3.1.0 synopsis: Combinators for describing binary data structures description: Combinators for describing binary data structures, which eliminate the boilerplate of having to write isomorphic Get and Put instances. Please see the Github page for examples. homepage: https://github.com/riugabachi/describe@@ -28,6 +28,7 @@ TypeFamilies, TypeOperators, OverlappingInstances,+ LambdaCase, GeneralizedNewtypeDeriving, FlexibleContexts, DefaultSignatures,@@ -63,6 +64,7 @@ Data.Serialize.Describe.Combinators.Byte, Data.Serialize.Describe.Combinators.Remaining, Data.Serialize.Describe.Combinators.ByteEnum,+ Data.Serialize.Describe.Combinators.NText, Data.Serialize.Describe.Class hs-source-dirs: src
src/Data/Serialize/Describe/Class.hs view
@@ -9,6 +9,7 @@ import Data.Serialize.Get import Data.Serialize.Put import Data.Vector.Fixed.Boxed (Vec)+import Data.Char import Data.Int import Data.Proxy import Data.Word@@ -47,6 +48,9 @@ instance Describe Bool where describe f = toEnum . fromIntegral <$> describe (fromIntegral @_ @Word8 . fromEnum . f)++instance Describe Char where+ describe f = chr . fromIntegral <$> describe @Word8 (fromIntegral . ord <$> f) instance Describe Word8 where describe f = Descriptor (fromIntegral <$> getWord8, \s' -> putWord8 (fromIntegral $ f s') >> pure (fromIntegral $ f s'))
src/Data/Serialize/Describe/Combinators.hs view
@@ -7,6 +7,7 @@ module Data.Serialize.Describe.Combinators.Const, module Data.Serialize.Describe.Combinators.ByteEnum, module Data.Serialize.Describe.Combinators.Conditional,+ module Data.Serialize.Describe.Combinators.NText, module Data.Serialize.Describe.Combinators.Byte ) where @@ -18,4 +19,5 @@ import Data.Serialize.Describe.Combinators.Const import Data.Serialize.Describe.Combinators.ByteEnum import Data.Serialize.Describe.Combinators.Conditional+import Data.Serialize.Describe.Combinators.NText import Data.Serialize.Describe.Combinators.Byte
+ src/Data/Serialize/Describe/Combinators/NText.hs view
@@ -0,0 +1,37 @@+module Data.Serialize.Describe.Combinators.NText where++import Data.Word+import Data.Char+import Data.String+import Data.Text (Text)+import qualified Data.Text as T+import Data.Serialize.Describe.Descriptor+import Data.Serialize.Describe.Class+import Data.Serialize.Put+import Control.Monad++-- | A null-terminated text descriptor which reads characters until '\0' is encountered. Semantically, the '\0' is consumed by the parser. The entire text will be serialized with a '\0' character appended to the end.+ntext :: (s -> Text) -> Descriptor s Text+ntext f = Descriptor (g, p)+ where+ g = unwrapGet $ T.pack . reverse <$> go []+ where+ go cs = describe @Char (const '\0') >>= \case+ '\0' -> pure cs+ c -> go $ c:cs+ p s = do+ forM_ (T.unpack (f s)) $ putWord8 . fromIntegral . ord+ putWord8 $ fromIntegral $ ord '\0'+ pure (f s)++-- | Type-level variant of @ftext@.+newtype NText = NText { unwrapNText :: Text }+ deriving (Show) via Text++instance IsString NText where+ fromString = NText . T.pack++instance Describe NText where+ describe f = + NText <$> ntext (fmap unwrapNText f)+