z :: Int -> Int
z a = 3 * a -- 3x3 = 9 => 3*3

y :: (Int -> Int) -> [Int] -> [Int]
-- y(\x -> 3*x) [1,2,3] -> [3,6,9]
y z lst = map z lst -- f(x) = 3x => f x = 3x

isEven :: Int -> Bool
isEven x = if x `mod` 2 == 0 then True else False

-- ~~mod(x, 2)~~ => x mod 2
-- isEven x = x `mod` 2 == 0

isAmongus :: String -> String
-- traverse each character and check if "amongus" is in the string, return the rest of the string
isAmongus [] = [] -- base case if the string is empty (or we reached the end of the string)
isAmongus (x : xs) -- recurse on the rest of the string
  | (take 7 (x : xs) == "amongus") = drop 7 (x : xs)
  | otherwise = isAmongus xs

b :: [Int] -> Int
b lst = sum (y z lst) -- = 18

allTogether :: [Int] -> Int
allTogether list = sum (map (3 *) list)

foo :: Integer -> Integer
foo 0 = 16
foo 1
  | "Haskell" > "C++" = 3
  | otherwise = 4
foo n
  | n < 0 = 0
  | n `mod` 17 == 2 = -43
  | otherwise = n + 3

bogus :: [a] -> Bool
bogus (x:_) = True
bogus _     = False


main :: IO ()
main = do
    print $ b [1, 2, 3]
    putStrLn "AAAAAAAAA"
    print $ allTogether [1, 2, 3]

    putStrLn "Finding amongus"
    print $ isAmongus "amongus"
    print $ isAmongus "aaaaaaaaaaaaaa"
    print $ isAmongus "askldhjewkjrhwekjrhwekjrhekjlfhbjerkshtjkernamogusejqwklwqhekqjwehqwjkamongusasdasdsad"

--   foos
    print $ foo 0

    print $ bogus [1,10..]

    -- compose 2 functions with a dot
    print $ (y z . y z) [1, 2, 3]
    print $ (y z . y z . y z) [1, 2, 3]
    print $ (.) (y z) (y z) [1, 2, 3]
    print $ y z $ y z [1, 2, 3]
