diff --git a/src/Instructions/StringInstructions.hs b/src/Instructions/StringInstructions.hs index 0e99477..2dbbd63 100644 --- a/src/Instructions/StringInstructions.hs +++ b/src/Instructions/StringInstructions.hs @@ -4,6 +4,9 @@ import State import Instructions.GenericInstructions import Data.List.Split +absNum :: Integral a => a -> [b] -> Int +absNum rawNum lst = abs (fromIntegral rawNum) `mod` length lst + combineString :: String -> (String, String) -> String combineString toInsert (front, back) = front <> toInsert <> back @@ -29,11 +32,7 @@ instructionStringFromLastChar state@(State {_string = s1 : ss}) = instructionStringFromLastChar state = state instructionStringFromNthChar :: State -> State -instructionStringFromNthChar state@(State {_string = s1 : ss, _int = i1 : is}) = - let - index = abs i1 `mod` length s1 - in - state{_string = [s1 !! index] : ss, _int = is} +instructionStringFromNthChar state@(State {_string = s1 : ss, _int = i1 : is}) = state{_string = [s1 !! absNum i1 s1] : ss, _int = is} instructionStringFromNthChar state = state -- instructionStringContainsString :: State -> State @@ -81,5 +80,95 @@ instructionStringOccurrencesOfString state@(State {_string = s1 : s2 : ss, _int instructionStringOccurrencesOfString state = state instructionStringInsertChar :: State -> State -instructionStringInsertChar state@(State {_string = s1 : ss, _char = c1 : cs, _int = i1 : is}) = state {_string = combineString [c1] (splitAt i1 s1) : ss, _char = cs, _int = is} +instructionStringInsertChar state@(State {_string = s1 : ss, _char = c1 : cs, _int = i1 : is}) = state{_string = combineString [c1] (splitAt i1 s1) : ss, _char = cs, _int = is} instructionStringInsertChar state = state + +instructionStringContainsChar :: State -> State +instructionStringContainsChar state@(State {_string = s1 : ss, _char = c1 : cs, _bool = bs}) = state{_string = ss, _char = cs, _bool = (findSubA s1 [c1] /= -1) : bs} +instructionStringContainsChar state = state + +instructionStringIndexOfChar :: State -> State +instructionStringIndexOfChar state@(State {_string = s1 : ss, _char = c1 : cs, _int = is}) = state{_string = ss, _char = cs, _int = findSubA s1 [c1] : is} +instructionStringIndexOfChar state = state + +instructionStringSplitOnChar :: State -> State +instructionStringSplitOnChar state@(State {_string = s1 : ss, _char = c1 : cs}) = state {_string = reverse $ splitOn [c1] s1 <> ss, _char = cs} +instructionStringSplitOnChar state = state + +instructionStringReplaceFirstChar :: State -> State +instructionStringReplaceFirstChar state@(State {_string = s1 : ss, _char = c1 : c2 : cs}) = state {_string = replace s1 [c1] [c2] (Just 1) : ss, _char = cs} +instructionStringReplaceFirstChar state = state + +instructionStringReplaceNChar :: State -> State +instructionStringReplaceNChar state@(State {_string = s1 : ss, _char = c1 : c2 : cs, _int = i1 : is}) = state{_string = replace s1 [c1] [c2] (Just i1) : ss, _char = cs, _int = is} +instructionStringReplaceNChar state = state + +instructionStringReplaceAllChar :: State -> State +instructionStringReplaceAllChar state@(State {_string = s1 : ss, _char = c1 : c2 : cs}) = state{_string = replace s1 [c1] [c2] Nothing : ss, _char = cs} +instructionStringReplaceAllChar state = state + +instructionStringRemoveFirstChar :: State -> State +instructionStringRemoveFirstChar state@(State {_string = s1 : ss, _char = c1 : cs}) = state {_string = replace s1 [c1] "" (Just 1) : ss, _char = cs} +instructionStringRemoveFirstChar state = state + +instructionStringRemoveNChar :: State -> State +instructionStringRemoveNChar state@(State {_string = s1 : ss, _char = c1 : cs, _int = i1 : is}) = state{_string = replace s1 [c1] "" (Just i1) : ss, _char = cs, _int = is} +instructionStringRemoveNChar state = state + +instructionStringRemoveAllChar :: State -> State +instructionStringRemoveAllChar state@(State {_string = s1 : ss, _char = c1 : cs}) = state{_string = replace s1 [c1] "" Nothing : ss, _char = cs} +instructionStringRemoveAllChar state = state + +instructionStringOccurrencesOfChar :: State -> State +instructionStringOccurrencesOfChar state@(State {_string = s1 : ss, _char = c1 : cs, _int = is}) = state{_string = ss, _char = cs, _int = amtOccurences s1 [c1] : is} +instructionStringOccurrencesOfChar state = state + +instructionStringReverse :: State -> State +instructionStringReverse state@(State {_string = s1 : ss}) = state{_string = reverse s1 : ss} +instructionStringReverse state = state + +instructionStringHead :: State -> State +instructionStringHead state@(State {_string = s1 : ss, _int = i1 : is}) = state{_string = take (absNum i1 s1) s1 : ss, _int = is} +instructionStringHead state = state + +instructionStringTail :: State -> State +instructionStringTail state@(State {_string = s1 : ss, _int = i1 : is}) = state{_string = takeR (absNum i1 s1) s1 : ss, _int = is} +instructionStringTail state = state + +instructionStringAppendChar :: State -> State +instructionStringAppendChar state@(State {_string = s1 : ss, _char = c1 : cs}) = state{_string = (c1 : s1) : ss, _char = cs} +instructionStringAppendChar state = state + +instructionStringRest :: State -> State +instructionStringRest state@(State {_string = s1 : ss}) = state{_string = drop 1 s1 : ss} +instructionStringRest state = state + +instructionStringButLast :: State -> State +instructionStringButLast state@(State {_string = s1 : ss}) = + if not $ null s1 + then state{_string = init s1 : ss} + else state +instructionStringButLast state = state + +instructionStringDrop :: State -> State +instructionStringDrop state@(State {_string = s1 : ss, _int = i1 : is}) = state{_string = drop (absNum i1 s1) s1 : ss, _int = is} +instructionStringDrop state = state + +instructionStringButLastN :: State -> State +instructionStringButLastN state@(State {_string = s1 : ss, _int = i1 : is}) = state{_string = dropR (absNum i1 s1) s1 : ss, _int = is} +instructionStringButLastN state = state + +instructionStringLength :: State -> State +instructionStringLength state@(State {_string = s1 : ss, _int = is}) = state{_string = ss, _int = length s1 : is} +instructionStringLength state = state + +instructionStringMakeEmpty :: State -> State +instructionStringMakeEmpty state@(State {_string = ss}) = state{_string = "" : ss} + +instructionStringIsEmptyString :: State -> State +instructionStringIsEmptyString state@(State {_string = s1 : ss, _bool = bs}) = state{_string = ss, _bool = null s1 : bs} +instructionStringIsEmptyString state = state + +instructionStringRemoveNth :: State -> State +instructionStringRemoveNth state@(State {_string = s1 : ss, _int = i1 : is}) = state{_string = deleteAt (absNum i1 s1) s1 : ss, _int = is} +instructionStringRemoveNth state = state