{-|

Module      : Lower
Description : Data type to produce only lowercase alphabetic characters.
Copyright   : © Frank Jung, 2021
License     : GPL-3

Reference
<https://stackoverflow.com/questions/23616455/haskell-type-new-type-or-data-for-only-an-upper-case-char
type for uppercase characters>

-}

module Lower (mkLower) where

import           Data.Char (isAlpha, isLower)

-- | Make a lowercase letter.
mkLower :: Char -> Either String Char
mkLower :: Char -> Either String Char
mkLower Char
x
  | Char -> Bool
isLower Char
x Bool -> Bool -> Bool
&& Char -> Bool
isAlpha Char
x = Char -> Either String Char
forall a b. b -> Either a b
Right Char
x
  | Bool
otherwise              = String -> Either String Char
forall a b. a -> Either a b
Left String
"Not lowercase"

-- {-# LANGUAGE DataKinds #-}
-- import Data.Finite
-- import Data.Char
--
-- newtype Letter = Letter{ getLetterIndex :: Finite 26 }
--
-- toLowerChar :: Letter -> Char
-- toLowerChar = chr . (+ ord 'a') . fromIntegral . getFinite . getLetterIndex
--
-- fromLowerChar :: Char -> Maybe Letter
-- fromLowerChar = fmap Letter . packFinite . fromIntegral . subtract (ord 'a') . ord