Per the assignment's instructions, the `Shift n` operation should treat
the *entire keyboard* like a cycle and shift that. I was erroneously
treating *each row* like a cycle and shifting those one-by-one.
This change fixes that. In addition, it also:
- Updates README.md with expected inputs and outputs
- Updates test suite
- Adds `split` dependency to {default,shell}.nix
		
	
			
		
			
				
	
	
		
			41 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
| --------------------------------------------------------------------------------
 | |
| module App where
 | |
| --------------------------------------------------------------------------------
 | |
| import Keyboard (Keyboard(..))
 | |
| import Transforms (Transform(..))
 | |
| import Utils ((|>))
 | |
| 
 | |
| import qualified Data.Char as Char
 | |
| import qualified Utils
 | |
| import qualified Data.List.Split as Split
 | |
| import qualified Keyboard
 | |
| import qualified Data.HashMap.Strict as HM
 | |
| --------------------------------------------------------------------------------
 | |
| 
 | |
| transform :: Keyboard -> Transform -> Keyboard
 | |
| 
 | |
| transform (Keyboard xs) xform =
 | |
|   case xform of
 | |
|     HorizontalFlip ->
 | |
|       xs
 | |
|       |> fmap reverse
 | |
|       |> Keyboard
 | |
| 
 | |
|     VerticalFlip ->
 | |
|       xs
 | |
|       |> reverse
 | |
|       |> Keyboard
 | |
| 
 | |
|     Shift n ->
 | |
|       xs
 | |
|       |> concat
 | |
|       |> Utils.rotate n
 | |
|       |> Split.chunksOf 10
 | |
|       |> Keyboard
 | |
| 
 | |
| retypePassage :: String -> Keyboard -> Maybe String
 | |
| retypePassage passage newKeyboard =
 | |
|   passage
 | |
|   |> fmap Char.toUpper
 | |
|   |> traverse (\c -> HM.lookup c Keyboard.charToCoord)
 | |
|   >>= traverse (Keyboard.coordToChar newKeyboard)
 |