streamly/examples/CamelCase.hs
2019-11-14 06:35:14 +05:30

34 lines
915 B
Haskell

-- ghc -O2 -fspec-constr-recursive=10 -fmax-worker-args=16
-- Convert the input file to camel case and write to stdout
import Data.Maybe (fromJust, isJust)
import System.Environment (getArgs)
import System.IO (Handle, IOMode(..), openFile, stdout)
import qualified Streamly.Prelude as S
import qualified Streamly.Internal.FileSystem.Handle as FH
camelCase :: Handle -> Handle -> IO ()
camelCase src dst =
FH.fromBytes dst
$ S.map fromJust
$ S.filter isJust
$ S.map snd
$ S.scanl' step (True, Nothing)
$ FH.toBytes src
where
step (wasSpace, _) x =
if x == 0x0a || x >= 0x41 && x <= 0x5a
then (False, Just x)
else if x >= 0x61 && x <= 0x7a
then (False, Just $ if wasSpace then x - 32 else x)
else (True, Nothing)
main :: IO ()
main = do
name <- fmap head getArgs
src <- openFile name ReadMode
camelCase src stdout