one 0.0.2 → 0.0.3
raw patch · 3 files changed
+115/−1 lines, 3 files
Files
- changelog.md +6/−0
- one.cabal +1/−1
- src/Control/One/One.hs +108/−0
changelog.md view
@@ -1,3 +1,9 @@+0.0.3++* Add `bytestring`, `lazyByteString`, `shortByteString` prisms and+ `ReviewOne`/`AsOne` instances for `ByteString` (strict, lazy, and short)+ in `Control.One.One`+ 0.0.2 * Introduce the `One f a t` data type representing a value with a
one.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.4 name: one-version: 0.0.2+version: 0.0.3 synopsis: One description: Data types that have a singleton view license: BSD-3-Clause
src/Control/One/One.hs view
@@ -45,6 +45,11 @@ lazyText, shortText, + -- ** ByteString+ bytestring,+ lazyByteString,+ shortByteString,+ -- ** Newtypes first', last',@@ -86,9 +91,13 @@ import Data.Semigroup.Bitraversable (Bitraversable1 (..)) import Data.Semigroup.Foldable (Foldable1 (..)) import Data.Semigroup.Traversable (Traversable1 (..))+import qualified Data.ByteString as ByteString+import qualified Data.ByteString.Lazy as LazyByteString+import qualified Data.ByteString.Short as ShortByteString import qualified Data.Text as Text import qualified Data.Text.Lazy as LazyText import qualified Data.Text.Short as ShortText+import Data.Word (Word8) import Data.Tuple (Solo (..)) import GHC.Generics (Generic, Par1 (..)) @@ -108,6 +117,9 @@ -- >>> import Data.Functor.Classes (liftEq, liftCompare, liftShowsPrec, liftEq2, liftCompare2, liftShowsPrec2) -- >>> import Data.Functor.Identity (Identity(..)) -- >>> import Data.List.NonEmpty (NonEmpty(..))+-- >>> import qualified Data.ByteString as ByteString+-- >>> import qualified Data.ByteString.Lazy as LazyByteString+-- >>> import qualified Data.ByteString.Short as ShortByteString -- >>> import qualified Data.Text as Text -- >>> import qualified Data.Text.Lazy as LazyText -- >>> import qualified Data.Text.Short as ShortText@@ -527,6 +539,102 @@ -- Nothing instance AsOne ShortText.ShortText (Const ShortText.ShortText) Char () where matchOne x = case ShortText.uncons x of+ Nothing -> Nothing+ Just (h, t) -> Just (One h (Const t))++-- | >>> preview bytestring (ByteString.pack [104, 101, 108, 108, 111])+-- Just (One 104 (Const "ello"))+--+-- >>> preview bytestring ByteString.empty+-- Nothing+--+-- >>> review bytestring (One 104 (Const (ByteString.pack [101, 108, 108, 111])))+-- "hello"+bytestring :: Prism' ByteString.ByteString (One (Const ByteString.ByteString) Word8 ())+bytestring =+ prism'+ (\(One h (Const t)) -> ByteString.cons h t)+ ( \x -> case ByteString.uncons x of+ Nothing -> Nothing+ Just (h, t) -> Just (One h (Const t))+ )++-- | >>> review reviewOne (One 104 (Const (ByteString.pack [105]))) :: ByteString.ByteString+-- "hi"+instance ReviewOne ByteString.ByteString (Const ByteString.ByteString) Word8 () where+ reviewOne = bytestring++-- | >>> preview _One (ByteString.pack [104, 105]) :: Maybe (One (Const ByteString.ByteString) Word8 ())+-- Just (One 104 (Const "i"))+--+-- >>> preview _One ByteString.empty :: Maybe (One (Const ByteString.ByteString) Word8 ())+-- Nothing+instance AsOne ByteString.ByteString (Const ByteString.ByteString) Word8 () where+ matchOne x = case ByteString.uncons x of+ Nothing -> Nothing+ Just (h, t) -> Just (One h (Const t))++-- | >>> preview lazyByteString (LazyByteString.pack [104, 101, 108, 108, 111])+-- Just (One 104 (Const "ello"))+--+-- >>> preview lazyByteString LazyByteString.empty+-- Nothing+--+-- >>> review lazyByteString (One 104 (Const (LazyByteString.pack [101, 108, 108, 111])))+-- "hello"+lazyByteString :: Prism' LazyByteString.ByteString (One (Const LazyByteString.ByteString) Word8 ())+lazyByteString =+ prism'+ (\(One h (Const t)) -> LazyByteString.cons h t)+ ( \x -> case LazyByteString.uncons x of+ Nothing -> Nothing+ Just (h, t) -> Just (One h (Const t))+ )++-- | >>> review reviewOne (One 104 (Const (LazyByteString.pack [105]))) :: LazyByteString.ByteString+-- "hi"+instance ReviewOne LazyByteString.ByteString (Const LazyByteString.ByteString) Word8 () where+ reviewOne = lazyByteString++-- | >>> preview _One (LazyByteString.pack [104, 105]) :: Maybe (One (Const LazyByteString.ByteString) Word8 ())+-- Just (One 104 (Const "i"))+--+-- >>> preview _One LazyByteString.empty :: Maybe (One (Const LazyByteString.ByteString) Word8 ())+-- Nothing+instance AsOne LazyByteString.ByteString (Const LazyByteString.ByteString) Word8 () where+ matchOne x = case LazyByteString.uncons x of+ Nothing -> Nothing+ Just (h, t) -> Just (One h (Const t))++-- | >>> preview shortByteString (ShortByteString.pack [104, 101, 108, 108, 111])+-- Just (One 104 (Const "ello"))+--+-- >>> preview shortByteString (ShortByteString.pack [])+-- Nothing+--+-- >>> review shortByteString (One 104 (Const (ShortByteString.pack [101, 108, 108, 111])))+-- "hello"+shortByteString :: Prism' ShortByteString.ShortByteString (One (Const ShortByteString.ShortByteString) Word8 ())+shortByteString =+ prism'+ (\(One h (Const t)) -> ShortByteString.cons h t)+ ( \x -> case ShortByteString.uncons x of+ Nothing -> Nothing+ Just (h, t) -> Just (One h (Const t))+ )++-- | >>> review reviewOne (One 104 (Const (ShortByteString.pack [105]))) :: ShortByteString.ShortByteString+-- "hi"+instance ReviewOne ShortByteString.ShortByteString (Const ShortByteString.ShortByteString) Word8 () where+ reviewOne = shortByteString++-- | >>> preview _One (ShortByteString.pack [104, 105]) :: Maybe (One (Const ShortByteString.ShortByteString) Word8 ())+-- Just (One 104 (Const "i"))+--+-- >>> preview _One (ShortByteString.pack []) :: Maybe (One (Const ShortByteString.ShortByteString) Word8 ())+-- Nothing+instance AsOne ShortByteString.ShortByteString (Const ShortByteString.ShortByteString) Word8 () where+ matchOne x = case ShortByteString.uncons x of Nothing -> Nothing Just (h, t) -> Just (One h (Const t))