From 78efab9064fa084d74cacd90010a11d61dd047d7 Mon Sep 17 00:00:00 2001 From: Rowan Torbitzky-Lane Date: Sat, 25 Jan 2025 00:15:19 -0600 Subject: [PATCH] more string instructions --- src/Instructions/StringInstructions.hs | 48 ++++++++++++++++---------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/src/Instructions/StringInstructions.hs b/src/Instructions/StringInstructions.hs index 2ce0b42..b15f3c7 100644 --- a/src/Instructions/StringInstructions.hs +++ b/src/Instructions/StringInstructions.hs @@ -39,33 +39,43 @@ instructionStringFromNthChar state = state -- instructionStringContainsString :: State -> State -- instructionStringContainsString state@(State ) --- Haskell is kinda really cool. This can totally be --- abstracted -findSubString :: String -> String -> Int -findSubString fullString subString - | length fullString < length subString = -1 - | length fullString == length subString = if fullString == subString then 0 else -1 - | otherwise = findSubString' fullString subString 0 - where - findSubString' :: String -> String -> Int -> Int - findSubString' fStr sStr index - | null fStr = -1 - | length sStr > length fStr = -1 - | sStr == take (length sStr) fStr = index - | otherwise = findSubString' (drop 1 fStr) sStr (index + 1) - instructionStringIndexOfString :: State -> State -instructionStringIndexOfString state@(State {_string = s1 : s2 : ss, _int = is}) = state {_string = ss, _int = findSubString s1 s2 : is} +instructionStringIndexOfString state@(State {_string = s1 : s2 : ss, _int = is}) = state {_string = ss, _int = findSubA s1 s2 : is} instructionStringIndexOfString state = state instructionStringContainsString :: State -> State -instructionStringContainsString state@(State {_string = s1 : s2 : ss, _bool = bs}) = state {_string = ss, _bool = (findSubString s1 s2 /= -1) : bs} +instructionStringContainsString state@(State {_string = s1 : s2 : ss, _bool = bs}) = state {_string = ss, _bool = (findSubA s1 s2 /= -1) : bs} instructionStringContainsString state = state +-- pysh reverses this. Check this for propeller instructionStringSplitOnString :: State -> State -instructionStringSplitOnString state@(State {_string = s1 : s2 : ss}) = state {_string = splitOn s2 s1 <> ss} +instructionStringSplitOnString state@(State {_string = s1 : s2 : ss}) = state {_string = reverse $ splitOn s2 s1 <> ss} instructionStringSplitOnString state = state instructionStringReplaceFirstString :: State -> State -instructionStringReplaceFirstString state@(State {_string = s1 : s2 : s3 : ss}) = undefined -- TODO +instructionStringReplaceFirstString state@(State {_string = s1 : s2 : s3 : ss}) = state {_string = replace s1 s2 s3 (Just 1) : ss} instructionStringReplaceFirstString state = state + +instructionStringReplaceNString :: State -> State +instructionStringReplaceNString state@(State {_string = s1 : s2 : s3 : ss, _int = i1 : is}) = state{_string = replace s1 s2 s3 (Just i1) : ss, _int = is} +instructionStringReplaceNString state = state + +instructionStringReplaceAllString :: State -> State +instructionStringReplaceAllString state@(State {_string = s1 : s2 : s3 : ss}) = state{_string = replace s1 s2 s3 Nothing : ss} +instructionStringReplaceAllString state = state + +instructionStringRemoveFirstString :: State -> State +instructionStringRemoveFirstString state@(State {_string = s1 : s2 : ss}) = state{_string = replace s1 s2 "" (Just 1) : ss} +instructionStringRemoveFirstString state = state + +instructionStringRemoveNString :: State -> State +instructionStringRemoveNString state@(State {_string = s1 : s2 : ss, _int = i1 : is}) = state{_string = replace s1 s2 "" (Just i1) : ss, _int = is} +instructionStringRemoveNString state = state + +instructionStringRemoveAllString :: State -> State +instructionStringRemoveAllString state@(State {_string = s1 : s2 : ss}) = state{_string = replace s1 s2 "" Nothing : ss} +instructionStringRemoveAllString state = state + +instructionStringOccurrencesOfString :: State -> State +instructionStringOccurrencesOfString state@(State {_string = s1 : s2 : ss, _int = is}) = state{_string = ss, _int = amtOccurences s1 s2 : is} +instructionStringOccurrencesOfString state = state