{-# LANGUAGE DerivingStrategies #-}
{-|

Module      : Strings
Description : Example string functions.
Copyright   : © Frank Jung, 2021-2023
License     : GPL-3.0-only

-}

module Strings
  ( -- * Types
    CharList(..)
    -- * Functions
  , removeNonUpperCase
  ) where

-- | Example of creating and using new types.
--
-- >>> CharList "this will be shown!"
-- CharList {getCharList = "this will be shown!"}
--
-- >>> CharList "benny" == CharList "benny"
-- True
--
-- >>> CharList "benny" == CharList "andy"
-- False
newtype CharList = CharList { CharList -> String
getCharList :: String }
  deriving stock (CharList -> CharList -> Bool
(CharList -> CharList -> Bool)
-> (CharList -> CharList -> Bool) -> Eq CharList
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CharList -> CharList -> Bool
== :: CharList -> CharList -> Bool
$c/= :: CharList -> CharList -> Bool
/= :: CharList -> CharList -> Bool
Eq, Int -> CharList -> ShowS
[CharList] -> ShowS
CharList -> String
(Int -> CharList -> ShowS)
-> (CharList -> String) -> ([CharList] -> ShowS) -> Show CharList
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CharList -> ShowS
showsPrec :: Int -> CharList -> ShowS
$cshow :: CharList -> String
show :: CharList -> String
$cshowList :: [CharList] -> ShowS
showList :: [CharList] -> ShowS
Show)

-- | Remove non upper case characters.
--
-- >>> removeNonUpperCase("ABcdeF")
-- "ABF"
removeNonUpperCase :: String -> String
removeNonUpperCase :: ShowS
removeNonUpperCase String
s = [Char
c | Char
c <- String
s, Char
c Char -> String -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Char
'A' .. Char
'Z']]