module Caesar ( caesar
, isAscii
, asciiRot
) where
import Data.Char (chr, ord)
isAscii :: Char -> Bool
isAscii :: Char -> Bool
isAscii Char
c = Int
33 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
oc Bool -> Bool -> Bool
&& Int
oc Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
126
where oc :: Int
oc = Char -> Int
ord Char
c
asciiRot :: Int -> Char -> Char
asciiRot :: Int -> Char -> Char
asciiRot Int
n Char
x
| Char -> Bool
isAscii Char
x = Char
rotate
| Bool
otherwise = Char
x
where rotate :: Char
rotate = Int -> Char
chr (Int -> Char) -> Int -> Char
forall a b. (a -> b) -> a -> b
$ (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Char -> Int
ord Char
x Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
33) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
94 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
33
caesar :: Int -> String -> String
caesar :: Int -> String -> String
caesar Int
n = (Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Char -> Char
asciiRot Int
n)