{-# LANGUAGE NoImplicitPrelude #-}

module Data.Digit.Char(
-- * Binary
  charBinaryNoZero
, charBinary
-- * Octal
, charOctalNoZero
, charOctal
-- * Decimal
, charDecimalNoZero
, charDecimal
-- * Hexadecimal
, charHexadecimalNoZero
, charHexadecimal
-- * HEXADECIMAL
, charHEXADECIMALNoZero
, charHEXADECIMAL
-- * HeXaDeCiMaL
, charHeXaDeCiMaLNoZero
, charHeXaDeCiMaL
) where

import           Prelude                (Char, Eq, fst, lookup)

import           Control.Applicative    (Applicative)
import           Control.Lens           (APrism, Choice, Prism', clonePrism,
                                         prism', ( # ))
import           Control.Lens.Extras    (is)

import           Data.Foldable          (find)
import           Data.Functor           ((<$>))
import           Data.Maybe             (fromMaybe)

import           Data.Digit.Binary      as D
import           Data.Digit.Decimal     as D
import           Data.Digit.Hexadecimal.LowerCase as D
import           Data.Digit.Hexadecimal.UpperCase as D
import           Data.Digit.Hexadecimal.MixedCase as D
import           Data.Digit.Octal       as D

-- $setup
-- >>> import Data.Digit

-- |
--
-- >>> '1' ^? charBinaryNoZero :: Maybe BinDigit
-- Just BinDigit1
--
-- >>> charBinaryNoZero # BinDigit1
-- '1'
charBinaryNoZero ::
  BinaryNoZero d =>
  Prism'
    Char
    d
charBinaryNoZero :: Prism' Char d
charBinaryNoZero =
  (Char, APrism d d () ())
-> [(Char, APrism d d () ())] -> p d (f d) -> p Char (f Char)
forall b (p :: * -> * -> *) (f :: * -> *) a.
(Eq b, Choice p, Applicative f) =>
(b, APrism a a () ())
-> [(b, APrism a a () ())] -> p a (f a) -> p b (f b)
associatePrism (Char
'1', APrism d d () ()
forall d. D1 d => Prism' d ()
d1) []

-- |
--
-- >>> '0' ^? charBinary :: Maybe BinDigit
-- Just BinDigit0
--
-- >>> charBinary # BinDigit0 :: Char
-- '0'
charBinary ::
  Binary d =>
  Prism'
    Char
    d
charBinary :: Prism' Char d
charBinary =
  (Char, APrism d d () ())
-> [(Char, APrism d d () ())] -> p d (f d) -> p Char (f Char)
forall b (p :: * -> * -> *) (f :: * -> *) a.
(Eq b, Choice p, Applicative f) =>
(b, APrism a a () ())
-> [(b, APrism a a () ())] -> p a (f a) -> p b (f b)
associatePrism (Char
'0', APrism d d () ()
forall d. D0 d => Prism' d ()
d0) [(Char
'1', APrism d d () ()
forall d. D1 d => Prism' d ()
d1)]

-- |
--
-- >>> '6' ^? charOctalNoZero :: Maybe OctDigit
-- Just OctDigit6
--
-- >>> charOctalNoZero # OctDigit5 :: Char
-- '5'
charOctalNoZero ::
  OctalNoZero d =>
  Prism'
    Char
    d
charOctalNoZero :: Prism' Char d
charOctalNoZero =
  (Char, APrism d d () ())
-> [(Char, APrism d d () ())] -> p d (f d) -> p Char (f Char)
forall b (p :: * -> * -> *) (f :: * -> *) a.
(Eq b, Choice p, Applicative f) =>
(b, APrism a a () ())
-> [(b, APrism a a () ())] -> p a (f a) -> p b (f b)
associatePrism (Char
'1', APrism d d () ()
forall d. D1 d => Prism' d ()
d1) [(Char
'2', APrism d d () ()
forall d. D2 d => Prism' d ()
d2), (Char
'3', APrism d d () ()
forall d. D3 d => Prism' d ()
d3), (Char
'4', APrism d d () ()
forall d. D4 d => Prism' d ()
d4), (Char
'5', APrism d d () ()
forall d. D5 d => Prism' d ()
d5), (Char
'6', APrism d d () ()
forall d. D6 d => Prism' d ()
d6), (Char
'7', APrism d d () ()
forall d. D7 d => Prism' d ()
d7)]

-- |
-- >>> '7' ^? charOctal :: Maybe OctDigit
-- Just OctDigit7
--
-- >>> charOctal # OctDigit7 :: Char
-- '7'
charOctal ::
  Octal d =>
  Prism'
    Char
    d
charOctal :: Prism' Char d
charOctal =
  (Char, APrism d d () ())
-> [(Char, APrism d d () ())] -> p d (f d) -> p Char (f Char)
forall b (p :: * -> * -> *) (f :: * -> *) a.
(Eq b, Choice p, Applicative f) =>
(b, APrism a a () ())
-> [(b, APrism a a () ())] -> p a (f a) -> p b (f b)
associatePrism (Char
'0', APrism d d () ()
forall d. D0 d => Prism' d ()
d0) [(Char
'1', APrism d d () ()
forall d. D1 d => Prism' d ()
d1), (Char
'2', APrism d d () ()
forall d. D2 d => Prism' d ()
d2), (Char
'3', APrism d d () ()
forall d. D3 d => Prism' d ()
d3), (Char
'4', APrism d d () ()
forall d. D4 d => Prism' d ()
d4), (Char
'5', APrism d d () ()
forall d. D5 d => Prism' d ()
d5), (Char
'6', APrism d d () ()
forall d. D6 d => Prism' d ()
d6), (Char
'7', APrism d d () ()
forall d. D7 d => Prism' d ()
d7)]

-- |
-- >>> '9' ^? charDecimalNoZero :: Maybe DecDigit
-- Just DecDigit9
--
-- >>> charDecimalNoZero # DecDigit9 :: Char
-- '9'
charDecimalNoZero ::
  DecimalNoZero d =>
  Prism'
    Char
    d
charDecimalNoZero :: Prism' Char d
charDecimalNoZero =
  (Char, APrism d d () ())
-> [(Char, APrism d d () ())] -> p d (f d) -> p Char (f Char)
forall b (p :: * -> * -> *) (f :: * -> *) a.
(Eq b, Choice p, Applicative f) =>
(b, APrism a a () ())
-> [(b, APrism a a () ())] -> p a (f a) -> p b (f b)
associatePrism (Char
'1', APrism d d () ()
forall d. D1 d => Prism' d ()
d1) [(Char
'2', APrism d d () ()
forall d. D2 d => Prism' d ()
d2), (Char
'3', APrism d d () ()
forall d. D3 d => Prism' d ()
d3), (Char
'4', APrism d d () ()
forall d. D4 d => Prism' d ()
d4), (Char
'5', APrism d d () ()
forall d. D5 d => Prism' d ()
d5), (Char
'6', APrism d d () ()
forall d. D6 d => Prism' d ()
d6), (Char
'7', APrism d d () ()
forall d. D7 d => Prism' d ()
d7), (Char
'8', APrism d d () ()
forall d. D8 d => Prism' d ()
d8), (Char
'9', APrism d d () ()
forall d. D9 d => Prism' d ()
d9)]

-- |
-- >>> '9' ^? charDecimal :: Maybe DecDigit
-- Just DecDigit9
--
-- >>> charDecimal # DecDigit9 :: Char
-- '9'
charDecimal ::
  Decimal d =>
  Prism'
    Char
    d
charDecimal :: Prism' Char d
charDecimal =
  (Char, APrism d d () ())
-> [(Char, APrism d d () ())] -> p d (f d) -> p Char (f Char)
forall b (p :: * -> * -> *) (f :: * -> *) a.
(Eq b, Choice p, Applicative f) =>
(b, APrism a a () ())
-> [(b, APrism a a () ())] -> p a (f a) -> p b (f b)
associatePrism (Char
'0', APrism d d () ()
forall d. D0 d => Prism' d ()
d0) [(Char
'1', APrism d d () ()
forall d. D1 d => Prism' d ()
d1), (Char
'2', APrism d d () ()
forall d. D2 d => Prism' d ()
d2), (Char
'3', APrism d d () ()
forall d. D3 d => Prism' d ()
d3), (Char
'4', APrism d d () ()
forall d. D4 d => Prism' d ()
d4), (Char
'5', APrism d d () ()
forall d. D5 d => Prism' d ()
d5), (Char
'6', APrism d d () ()
forall d. D6 d => Prism' d ()
d6), (Char
'7', APrism d d () ()
forall d. D7 d => Prism' d ()
d7), (Char
'8', APrism d d () ()
forall d. D8 d => Prism' d ()
d8), (Char
'9', APrism d d () ()
forall d. D9 d => Prism' d ()
d9)]

-- |
-- >>> 'f' ^? charHexadecimalNoZero :: Maybe HexDigit
-- Just HexDigitf
--
-- >>> charHexadecimalNoZero # HexDigitf :: Char
-- 'f'
charHexadecimalNoZero ::
  HexadecimalNoZero d =>
  Prism'
    Char
    d
charHexadecimalNoZero :: Prism' Char d
charHexadecimalNoZero =
  (Char, APrism d d () ())
-> [(Char, APrism d d () ())] -> p d (f d) -> p Char (f Char)
forall b (p :: * -> * -> *) (f :: * -> *) a.
(Eq b, Choice p, Applicative f) =>
(b, APrism a a () ())
-> [(b, APrism a a () ())] -> p a (f a) -> p b (f b)
associatePrism (Char
'1', APrism d d () ()
forall d. D1 d => Prism' d ()
d1) [(Char
'2', APrism d d () ()
forall d. D2 d => Prism' d ()
d2), (Char
'3', APrism d d () ()
forall d. D3 d => Prism' d ()
d3), (Char
'4', APrism d d () ()
forall d. D4 d => Prism' d ()
d4), (Char
'5', APrism d d () ()
forall d. D5 d => Prism' d ()
d5), (Char
'6', APrism d d () ()
forall d. D6 d => Prism' d ()
d6), (Char
'7', APrism d d () ()
forall d. D7 d => Prism' d ()
d7), (Char
'8', APrism d d () ()
forall d. D8 d => Prism' d ()
d8), (Char
'9', APrism d d () ()
forall d. D9 d => Prism' d ()
d9), (Char
'a', APrism d d () ()
forall d. Da d => Prism' d ()
da), (Char
'b', APrism d d () ()
forall d. Db d => Prism' d ()
db), (Char
'c', APrism d d () ()
forall d. Dc d => Prism' d ()
dc), (Char
'd', APrism d d () ()
forall d. Dd d => Prism' d ()
dd), (Char
'e', APrism d d () ()
forall d. De d => Prism' d ()
de), (Char
'f', APrism d d () ()
forall d. Df d => Prism' d ()
df)]

-- |
-- >>> 'f' ^? charHexadecimal :: Maybe HexDigit
-- Just HexDigitf
--
-- >>> charHexadecimal # HexDigitf :: Char
-- 'f'
charHexadecimal ::
  Hexadecimal d =>
  Prism'
    Char
    d
charHexadecimal :: Prism' Char d
charHexadecimal =
  (Char, APrism d d () ())
-> [(Char, APrism d d () ())] -> p d (f d) -> p Char (f Char)
forall b (p :: * -> * -> *) (f :: * -> *) a.
(Eq b, Choice p, Applicative f) =>
(b, APrism a a () ())
-> [(b, APrism a a () ())] -> p a (f a) -> p b (f b)
associatePrism (Char
'0', APrism d d () ()
forall d. D0 d => Prism' d ()
d0) [(Char
'1', APrism d d () ()
forall d. D1 d => Prism' d ()
d1), (Char
'2', APrism d d () ()
forall d. D2 d => Prism' d ()
d2), (Char
'3', APrism d d () ()
forall d. D3 d => Prism' d ()
d3), (Char
'4', APrism d d () ()
forall d. D4 d => Prism' d ()
d4), (Char
'5', APrism d d () ()
forall d. D5 d => Prism' d ()
d5), (Char
'6', APrism d d () ()
forall d. D6 d => Prism' d ()
d6), (Char
'7', APrism d d () ()
forall d. D7 d => Prism' d ()
d7), (Char
'8', APrism d d () ()
forall d. D8 d => Prism' d ()
d8), (Char
'9', APrism d d () ()
forall d. D9 d => Prism' d ()
d9), (Char
'a', APrism d d () ()
forall d. Da d => Prism' d ()
da), (Char
'b', APrism d d () ()
forall d. Db d => Prism' d ()
db), (Char
'c', APrism d d () ()
forall d. Dc d => Prism' d ()
dc), (Char
'd', APrism d d () ()
forall d. Dd d => Prism' d ()
dd), (Char
'e', APrism d d () ()
forall d. De d => Prism' d ()
de), (Char
'f', APrism d d () ()
forall d. Df d => Prism' d ()
df)]

-- |
-- >>> 'F' ^? charHEXADECIMALNoZero :: Maybe HEXDigit
-- Just HEXDigitF
--
-- >>> charHEXADECIMALNoZero # HEXDigitF :: Char
-- 'F'
charHEXADECIMALNoZero ::
  HEXADECIMALNoZero d =>
  Prism'
    Char
    d
charHEXADECIMALNoZero :: Prism' Char d
charHEXADECIMALNoZero =
  (Char, APrism d d () ())
-> [(Char, APrism d d () ())] -> p d (f d) -> p Char (f Char)
forall b (p :: * -> * -> *) (f :: * -> *) a.
(Eq b, Choice p, Applicative f) =>
(b, APrism a a () ())
-> [(b, APrism a a () ())] -> p a (f a) -> p b (f b)
associatePrism (Char
'1', APrism d d () ()
forall d. D1 d => Prism' d ()
d1) [(Char
'2', APrism d d () ()
forall d. D2 d => Prism' d ()
d2), (Char
'3', APrism d d () ()
forall d. D3 d => Prism' d ()
d3), (Char
'4', APrism d d () ()
forall d. D4 d => Prism' d ()
d4), (Char
'5', APrism d d () ()
forall d. D5 d => Prism' d ()
d5), (Char
'6', APrism d d () ()
forall d. D6 d => Prism' d ()
d6), (Char
'7', APrism d d () ()
forall d. D7 d => Prism' d ()
d7), (Char
'8', APrism d d () ()
forall d. D8 d => Prism' d ()
d8), (Char
'9', APrism d d () ()
forall d. D9 d => Prism' d ()
d9), (Char
'A', APrism d d () ()
forall d. DA d => Prism' d ()
dA), (Char
'B', APrism d d () ()
forall d. DB d => Prism' d ()
dB), (Char
'C', APrism d d () ()
forall d. DC d => Prism' d ()
dC), (Char
'D', APrism d d () ()
forall d. DD d => Prism' d ()
dD), (Char
'E', APrism d d () ()
forall d. DE d => Prism' d ()
dE), (Char
'F', APrism d d () ()
forall d. DF d => Prism' d ()
dF)]

-- |
-- >>> 'F' ^? charHEXADECIMAL :: Maybe HEXDigit
-- Just HEXDigitF
--
-- >>> charHEXADECIMAL # HEXDigitF :: Char
-- 'F'
charHEXADECIMAL ::
  HEXADECIMAL d =>
  Prism'
    Char
    d
charHEXADECIMAL :: Prism' Char d
charHEXADECIMAL =
  (Char, APrism d d () ())
-> [(Char, APrism d d () ())] -> p d (f d) -> p Char (f Char)
forall b (p :: * -> * -> *) (f :: * -> *) a.
(Eq b, Choice p, Applicative f) =>
(b, APrism a a () ())
-> [(b, APrism a a () ())] -> p a (f a) -> p b (f b)
associatePrism (Char
'0', APrism d d () ()
forall d. D0 d => Prism' d ()
d0) [(Char
'1', APrism d d () ()
forall d. D1 d => Prism' d ()
d1), (Char
'2', APrism d d () ()
forall d. D2 d => Prism' d ()
d2), (Char
'3', APrism d d () ()
forall d. D3 d => Prism' d ()
d3), (Char
'4', APrism d d () ()
forall d. D4 d => Prism' d ()
d4), (Char
'5', APrism d d () ()
forall d. D5 d => Prism' d ()
d5), (Char
'6', APrism d d () ()
forall d. D6 d => Prism' d ()
d6), (Char
'7', APrism d d () ()
forall d. D7 d => Prism' d ()
d7), (Char
'8', APrism d d () ()
forall d. D8 d => Prism' d ()
d8), (Char
'9', APrism d d () ()
forall d. D9 d => Prism' d ()
d9), (Char
'A', APrism d d () ()
forall d. DA d => Prism' d ()
dA), (Char
'B', APrism d d () ()
forall d. DB d => Prism' d ()
dB), (Char
'C', APrism d d () ()
forall d. DC d => Prism' d ()
dC), (Char
'D', APrism d d () ()
forall d. DD d => Prism' d ()
dD), (Char
'E', APrism d d () ()
forall d. DE d => Prism' d ()
dE), (Char
'F', APrism d d () ()
forall d. DF d => Prism' d ()
dF)]

-- |
-- >>> 'f' ^? charHeXaDeCiMaLNoZero :: Maybe HeXDigit
-- Just HeXDigitf
--
-- >>> 'F' ^? charHeXaDeCiMaLNoZero :: Maybe HeXDigit
-- Just HeXDigitF
--
-- >>> charHeXaDeCiMaLNoZero # HeXDigitf :: Char
-- 'f'
--
-- >>> charHeXaDeCiMaLNoZero # HeXDigitF :: Char
-- 'F'
charHeXaDeCiMaLNoZero ::
  HeXaDeCiMaLNoZero d =>
  Prism'
    Char
    d
charHeXaDeCiMaLNoZero :: Prism' Char d
charHeXaDeCiMaLNoZero =
  (Char, APrism d d () ())
-> [(Char, APrism d d () ())] -> p d (f d) -> p Char (f Char)
forall b (p :: * -> * -> *) (f :: * -> *) a.
(Eq b, Choice p, Applicative f) =>
(b, APrism a a () ())
-> [(b, APrism a a () ())] -> p a (f a) -> p b (f b)
associatePrism (Char
'1', APrism d d () ()
forall d. D1 d => Prism' d ()
d1) [(Char
'2', APrism d d () ()
forall d. D2 d => Prism' d ()
d2), (Char
'3', APrism d d () ()
forall d. D3 d => Prism' d ()
d3), (Char
'4', APrism d d () ()
forall d. D4 d => Prism' d ()
d4), (Char
'5', APrism d d () ()
forall d. D5 d => Prism' d ()
d5), (Char
'6', APrism d d () ()
forall d. D6 d => Prism' d ()
d6), (Char
'7', APrism d d () ()
forall d. D7 d => Prism' d ()
d7), (Char
'8', APrism d d () ()
forall d. D8 d => Prism' d ()
d8), (Char
'9', APrism d d () ()
forall d. D9 d => Prism' d ()
d9), (Char
'a', APrism d d () ()
forall d. Da d => Prism' d ()
da), (Char
'b', APrism d d () ()
forall d. Db d => Prism' d ()
db), (Char
'c', APrism d d () ()
forall d. Dc d => Prism' d ()
dc), (Char
'd', APrism d d () ()
forall d. Dd d => Prism' d ()
dd), (Char
'e', APrism d d () ()
forall d. De d => Prism' d ()
de), (Char
'f', APrism d d () ()
forall d. Df d => Prism' d ()
df), (Char
'A', APrism d d () ()
forall d. DA d => Prism' d ()
dA), (Char
'B', APrism d d () ()
forall d. DB d => Prism' d ()
dB), (Char
'C', APrism d d () ()
forall d. DC d => Prism' d ()
dC), (Char
'D', APrism d d () ()
forall d. DD d => Prism' d ()
dD), (Char
'E', APrism d d () ()
forall d. DE d => Prism' d ()
dE), (Char
'F', APrism d d () ()
forall d. DF d => Prism' d ()
dF)]


-- |
-- >>> 'f' ^? charHeXaDeCiMaL :: Maybe HeXDigit
-- Just HeXDigitf
--
-- >>> 'F' ^? charHeXaDeCiMaL :: Maybe HeXDigit
-- Just HeXDigitF
--
-- >>> charHeXaDeCiMaL # HeXDigitf :: Char
-- 'f'
--
-- >>> charHeXaDeCiMaL # HeXDigitF :: Char
-- 'F'
charHeXaDeCiMaL ::
  HeXaDeCiMaL d =>
  Prism'
    Char
    d
charHeXaDeCiMaL :: Prism' Char d
charHeXaDeCiMaL =
  (Char, APrism d d () ())
-> [(Char, APrism d d () ())] -> p d (f d) -> p Char (f Char)
forall b (p :: * -> * -> *) (f :: * -> *) a.
(Eq b, Choice p, Applicative f) =>
(b, APrism a a () ())
-> [(b, APrism a a () ())] -> p a (f a) -> p b (f b)
associatePrism (Char
'0', APrism d d () ()
forall d. D0 d => Prism' d ()
d0) [(Char
'1', APrism d d () ()
forall d. D1 d => Prism' d ()
d1), (Char
'2', APrism d d () ()
forall d. D2 d => Prism' d ()
d2), (Char
'3', APrism d d () ()
forall d. D3 d => Prism' d ()
d3), (Char
'4', APrism d d () ()
forall d. D4 d => Prism' d ()
d4), (Char
'5', APrism d d () ()
forall d. D5 d => Prism' d ()
d5), (Char
'6', APrism d d () ()
forall d. D6 d => Prism' d ()
d6), (Char
'7', APrism d d () ()
forall d. D7 d => Prism' d ()
d7), (Char
'8', APrism d d () ()
forall d. D8 d => Prism' d ()
d8), (Char
'9', APrism d d () ()
forall d. D9 d => Prism' d ()
d9), (Char
'a', APrism d d () ()
forall d. Da d => Prism' d ()
da), (Char
'b', APrism d d () ()
forall d. Db d => Prism' d ()
db), (Char
'c', APrism d d () ()
forall d. Dc d => Prism' d ()
dc), (Char
'd', APrism d d () ()
forall d. Dd d => Prism' d ()
dd), (Char
'e', APrism d d () ()
forall d. De d => Prism' d ()
de), (Char
'f', APrism d d () ()
forall d. Df d => Prism' d ()
df), (Char
'A', APrism d d () ()
forall d. DA d => Prism' d ()
dA), (Char
'B', APrism d d () ()
forall d. DB d => Prism' d ()
dB), (Char
'C', APrism d d () ()
forall d. DC d => Prism' d ()
dC), (Char
'D', APrism d d () ()
forall d. DD d => Prism' d ()
dD), (Char
'E', APrism d d () ()
forall d. DE d => Prism' d ()
dE), (Char
'F', APrism d d () ()
forall d. DF d => Prism' d ()
dF)]

---- not exported
associatePrism ::
  (Eq b, Choice p, Applicative f) =>
  (b, APrism a a () ())
  -> [(b, APrism a a () ())]
  -> p a (f a)
  -> p b (f b)
associatePrism :: (b, APrism a a () ())
-> [(b, APrism a a () ())] -> p a (f a) -> p b (f b)
associatePrism (b, APrism a a () ())
def [(b, APrism a a () ())]
z =
  (a -> b) -> (b -> Maybe a) -> Prism b b a a
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism'
    (\a
d -> (b, APrism a a () ()) -> b
forall a b. (a, b) -> a
fst ((b, APrism a a () ())
-> Maybe (b, APrism a a () ()) -> (b, APrism a a () ())
forall a. a -> Maybe a -> a
fromMaybe (b, APrism a a () ())
def (((b, APrism a a () ()) -> Bool)
-> [(b, APrism a a () ())] -> Maybe (b, APrism a a () ())
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find (\(b
_, APrism a a () ()
w) -> APrism a a () () -> a -> Bool
forall s t a b. APrism s t a b -> s -> Bool
is APrism a a () ()
w a
d) [(b, APrism a a () ())]
z)))
    (\b
i -> (\APrism a a () ()
p -> APrism a a () () -> Prism a a () ()
forall s t a b. APrism s t a b -> Prism s t a b
clonePrism APrism a a () ()
p (Tagged () (Identity ()) -> Tagged a (Identity a)) -> () -> a
forall t b. AReview t b -> b -> t
# ()) (APrism a a () () -> a) -> Maybe (APrism a a () ()) -> Maybe a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> b -> [(b, APrism a a () ())] -> Maybe (APrism a a () ())
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup b
i ((b, APrism a a () ())
def(b, APrism a a () ())
-> [(b, APrism a a () ())] -> [(b, APrism a a () ())]
forall a. a -> [a] -> [a]
:[(b, APrism a a () ())]
z))