packages feed

nat-optics-1.0.0.3: src/NatOptics/Internal.hs

{-# 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.unpack Text.pack

strNat :: Prism' String Natural
strNat = readShowPrism

readShowPrism :: (Read a, Show a) => Prism' String a
readShowPrism = prism' show (\str -> mfilter (\n -> show n == str) (readMaybe str))