content: use framework "Foundation"
  
  -- CASE-INSENSITIVE PALINDROME, IGNORING SPACES ? ----------------------------
  
  -- isPalindrome :: String -> Bool
  on isPalindrome(s)
      s = intercalate("", reverse of characters of s)
  end isPalindrome
  
  -- toSpaceFreeLower :: String -> String
  on spaceFreeToLower(s)
      script notSpace
          on |λ|(s)
              s is not space
          end |λ|
      end script
  
      intercalate("", filter(notSpace, characters of toLower(s)))
  end spaceFreeToLower
  
  
  -- TEST ----------------------------------------------------------------------
  on run
  
      isPalindrome(spaceFreeToLower("In girum imus nocte et consumimur igni"))
  
      --> true
  
  end run
  
  
  -- GENERIC FUNCTIONS ---------------------------------------------------------
  
  -- filter :: (a -> Bool) -> [a] -> [a]
  on filter(f, xs)
      tell mReturn(f)
          set lst to {}
          set lng to length of xs
          repeat with i from 1 to lng
              set v to item i of xs
              if |λ|(v, i, xs) then set end of lst to v
          end repeat
          return lst
      end tell
  end filter
  
  -- intercalate :: Text -> [Text] -> Text
  on intercalate(strText, lstText)
      set {dlm, my text item delimiters} to {my text item delimiters, strText}
      set strJoined to lstText as text
      set my text item delimiters to dlm
      return strJoined
  end intercalate
  
  -- Lift 2nd class handler function into 1st class script wrapper
  -- mReturn :: Handler -> Script
  on mReturn(f)
      if class of f is script then
          f
      else
          script
              property |λ| : f
          end script
      end if
  end mReturn
  
  -- toLower :: String -> String
  on toLower(str)
      set ca to current application
      ((ca's NSString's stringWithString:(str))'s ¬
          lowercaseStringWithLocale:(ca's NSLocale's currentLocale())) as text
  end toLower
  