module Data.List.Util.Listable (
tab
, fromTabbed
, toTabbed
, fromTabbeds
, toTabbeds
, Listable(..)
, fromStringList
, toStringList
, fromTabbedList
, toTabbedList
, fromStringLists
, toStringLists
, fromTabbedLists
, toTabbedLists
, fromTransposedTabbedLists
, toTransposedTabbedLists
, WithHeader(..)
, fromStringListsWithHeader
, toStringListsWithHeader
, fromTabbedListsWithHeader
, toTabbedListsWithHeader
, readTabbedListsWithHeader
, writeTabbedListsWithHeader
, fromTransposedTabbedListsWithHeader
, toTransposedTabbedListsWithHeader
, readTransposedTabbedListsWithHeader
, writeTransposedTabbedListsWithHeader
) where
import Control.Applicative (liftA2)
import Control.Arrow ((&&&))
import Data.List (intercalate, transpose)
import Data.List.Split (splitOn)
import Data.String.Util (Stringy(..))
tab :: String
tab = "\t"
fromTabbed :: String
-> [String]
fromTabbed = splitOn tab
toTabbed :: [String]
-> String
toTabbed = intercalate tab
fromTabbeds :: String
-> [[String]]
fromTabbeds = fmap fromTabbed . lines
toTabbeds :: [[String]]
-> String
toTabbeds = unlines . fmap toTabbed
class Listable a b | a -> b where
fromList :: [b]
-> a
toList :: a
-> [b]
fromStringList :: (Listable a b, Stringy b)
=> [String]
-> a
fromStringList = fromList . fmap fromString
toStringList :: (Listable a b, Stringy b)
=> a
-> [String]
toStringList = fmap toString . toList
fromTabbedList :: (Listable a b, Stringy b)
=> String
-> a
fromTabbedList = fromStringList . fromTabbed
toTabbedList :: (Listable a b, Stringy b)
=> a
-> String
toTabbedList = toTabbed . toStringList
fromStringLists :: (Listable a b, Listable b c, Stringy c)
=> [[String]]
-> a
fromStringLists = fromList . fmap fromStringList
toStringLists :: (Listable a b, Listable b c, Stringy c)
=> a
-> [[String]]
toStringLists = fmap toStringList . toList
fromTabbedLists :: (Listable a b, Listable b c, Stringy c)
=> String
-> a
fromTabbedLists = fromStringLists . fromTabbeds
toTabbedLists :: (Listable a b, Listable b c, Stringy c)
=> a
-> String
toTabbedLists = toTabbeds . toStringLists
fromTransposedTabbedLists :: (Listable a b, Listable b c, Stringy c)
=> String
-> a
fromTransposedTabbedLists = fromStringLists . transpose . fromTabbeds
toTransposedTabbedLists :: (Listable a b, Listable b c, Stringy c)
=> a
-> String
toTransposedTabbedLists = toTabbeds . transpose . toStringLists
class WithHeader a b | a -> b where
fromHeaderLists :: ([String], [b])
-> a
toHeaderLists :: a
-> ([String], [b])
fromStringListsWithHeader :: (WithHeader a b, Listable b c, Stringy c)
=> [[String]]
-> a
fromStringListsWithHeader = fromHeaderLists . (head &&& fmap fromStringList . tail)
toStringListsWithHeader :: (WithHeader a b, Listable b c, Stringy c)
=> a
-> [[String]]
toStringListsWithHeader = liftA2 (:) fst (fmap toStringList . snd) . toHeaderLists
fromTabbedListsWithHeader :: (WithHeader a b, Listable b c, Stringy c)
=> String
-> a
fromTabbedListsWithHeader = fromStringListsWithHeader . fromTabbeds
toTabbedListsWithHeader :: (WithHeader a b, Listable b c, Stringy c)
=> a
-> String
toTabbedListsWithHeader = toTabbeds . toStringListsWithHeader
readTabbedListsWithHeader :: (WithHeader a b, Listable b c, Stringy c)
=> FilePath
-> IO a
readTabbedListsWithHeader = fmap fromTabbedListsWithHeader . readFile
writeTabbedListsWithHeader :: (WithHeader a b, Listable b c, Stringy c)
=> FilePath
-> a
-> IO ()
writeTabbedListsWithHeader = (. toTabbedListsWithHeader) . writeFile
fromTransposedTabbedListsWithHeader :: (WithHeader a b, Listable b c, Stringy c)
=> String
-> a
fromTransposedTabbedListsWithHeader = fromStringListsWithHeader . transpose . fromTabbeds
toTransposedTabbedListsWithHeader :: (WithHeader a b, Listable b c, Stringy c)
=> a
-> String
toTransposedTabbedListsWithHeader = toTabbeds . transpose . toStringListsWithHeader
readTransposedTabbedListsWithHeader :: (WithHeader a b, Listable b c, Stringy c)
=> FilePath
-> IO a
readTransposedTabbedListsWithHeader = fmap fromTransposedTabbedListsWithHeader . readFile
writeTransposedTabbedListsWithHeader :: (WithHeader a b, Listable b c, Stringy c)
=> FilePath
-> a
-> IO ()
writeTransposedTabbedListsWithHeader = (. toTransposedTabbedListsWithHeader) . writeFile