{-# LANGUAGE OverloadedStrings #-} import Data.Char (isLower, isNumber) import Data.Text.Lazy (unpack, Text) import Data.Monoid (mappend) import Data.Text.Lazy (lines, Text, all, unpack, splitOn) import Prelude hiding(lines, all) import Shelly (<>) = mappend data NewUser = NewUser { login :: Text , lastName :: Text , firstName :: Text } usersFromCSV :: Text -> [NewUser] usersFromCSV csv = map userFromLine (lines csv) where userFromLine line = toUser (line `splitOn` ",") where toUser (l:lname:fname:[]) | checkLogin l = NewUser {login = l, lastName = lname, firstName = fname} toUser _ = error $ unpack $ "expected \"login,lastname,firstname\" but got: " <> line checkLogin = all (\char -> isLower char || isNumber char)