base16-lens-0.1.2.0: src/Data/ByteString/Base16/Lens.hs
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ViewPatterns #-}
-- |
-- Module : Data.Text.Encoding.Base16.Lens
-- Copyright : (c) 2019 Emily Pillmore
-- License : BSD-style
--
-- Maintainer : Emily Pillmore <emilypi@cohomolo.gy>
-- Stability : Experimental
-- Portability : non-portable
--
-- This module contains 'Prism''s and 'Iso''s for Base16-encoding and
-- decoding 'ByteString' values.
--
module Data.ByteString.Base16.Lens
( -- * Prisms
_Hex
, _Base16
-- * Isos
, _Base16Lenient
-- * Patterns
, pattern Hex
, pattern Base16
, pattern Base16Lenient
) where
import Control.Lens
import Data.ByteString (ByteString)
import qualified Data.ByteString.Base16 as B16
-- $setup
--
-- >>> import Control.Lens
-- >>> import Data.ByteString.Base16.Lens
--
-- >>> :set -XOverloadedStrings
-- >>> :set -XTypeApplications
-- -------------------------------------------------------------------------- --
-- Optics
-- | A 'Prism'' into the Base16 encoding of a 'ByteString' value.
--
-- >>> _Base16 # "Sun"
-- "53756e"
--
-- >>> "53756e" ^? _Base16
-- Just "Sun"
--
_Base16 :: Prism' ByteString ByteString
_Base16 = prism' B16.encodeBase16' $ \s -> case B16.decodeBase16 s of
Left _ -> Nothing
Right a -> Just a
{-# INLINE _Base16 #-}
-- | A 'Prism'' into the Base16 encoding of a 'ByteString' value. This is an
-- alias for '_Base16'.
--
-- >>> _Hex # "Sun"
-- "53756e"
--
-- >>> "53756e" ^? _Hex
-- Just "Sun"
--
_Hex :: Prism' ByteString ByteString
_Hex = prism' B16.encodeBase16' $ \s -> case B16.decodeBase16 s of
Left _ -> Nothing
Right a -> Just a
{-# INLINE _Hex #-}
-- | A 'Iso'' into the Base16 encoding of a leniently decoded
-- 'ByteString' value.
--
-- >>> _Base16Lenient # "Sun"
-- "53756e"
--
-- >>> "53756e" ^. _Base16Lenient
-- "Sun"
--
_Base16Lenient :: Iso' ByteString ByteString
_Base16Lenient = iso B16.decodeBase16Lenient B16.encodeBase16'
{-# INLINE _Base16Lenient #-}
-- -------------------------------------------------------------------------- --
-- Patterns
-- | Bidirectional pattern synonym for Base16-encoded 'ByteString' values.
--
pattern Hex :: ByteString -> ByteString
pattern Hex a <- (preview _Hex -> Just a) where
Hex a = _Hex # a
-- | Bidirectional pattern synonym for Base16-encoded 'ByteString' values.
--
pattern Base16 :: ByteString -> ByteString
pattern Base16 a <- (preview _Base16 -> Just a) where
Base16 a = _Base16 # a
-- | Bidirectional pattern synonym for leniently decoded,
-- Base16-encoded 'ByteString' values.
--
pattern Base16Lenient :: ByteString -> ByteString
pattern Base16Lenient a <- (view (from _Base16Lenient) -> a) where
Base16Lenient a = view _Base16 a