{-# language Trustworthy #-}

module NatOptics.Internal
  (
    strNat, textStr,
  )
  where

import Control.Monad   ( mfilter )
import Data.Eq         ( (==) )
import Data.String     ( String )
import Data.Text       ( Text )
import Numeric.Natural ( Natural )
import Optics.Iso      ( Iso', iso )
import Optics.Prism    ( Prism', prism' )
import Text.Read       ( Read, readMaybe )
import Text.Show       ( Show, show )

import qualified Data.Text as Text

textStr :: Iso' Text String
textStr :: Iso' Text String
textStr = (Text -> String) -> (String -> Text) -> Iso' Text String
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso Text -> String
Text.unpack String -> Text
Text.pack

strNat :: Prism' String Natural
strNat :: Prism' String Natural
strNat = Prism' String Natural
forall a. (Read a, Show a) => Prism' String a
readShowPrism

readShowPrism :: (Read a, Show a) => Prism' String a
readShowPrism :: Prism' String a
readShowPrism = (a -> String) -> (String -> Maybe a) -> Prism' String a
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism' a -> String
forall a. Show a => a -> String
show (\String
str -> (a -> Bool) -> Maybe a -> Maybe a
forall (m :: * -> *) a. MonadPlus m => (a -> Bool) -> m a -> m a
mfilter (\a
n -> a -> String
forall a. Show a => a -> String
show a
n String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
str) (String -> Maybe a
forall a. Read a => String -> Maybe a
readMaybe String
str))