module Text.HPaco.Writers.Run.Library ( loadLibrary ) where import Data.Variant as V import Data.Variant.ToFrom import qualified Data.List.Split as Split import Data.List as List import Data.Tuple (swap) join :: String -> [String] -> String join sep lst = List.concat $ List.intersperse sep lst split :: String -> String -> [String] split sep str = Split.splitOn sep str map_ :: [Variant] -> Variant map_ (fv:xsv:_) = let f = case fv of Function ff -> (\a -> ff [a]) otherwise -> id xs = V.values xsv ks = V.keys xsv in AList $ zip ks $ map f xs map_ _ = V.Null zip_ :: [Variant] -> Variant zip_ (k:v:_) = let ka = values k kv = values v in AList $ zip ka kv zip_ _ = V.Null loadLibrary :: String -> Variant loadLibrary "list" = AList [ ( String "count", Function (toVariant . length . toAList . head) ) , ( String "sort", Function (toVariant . map swap . List.sort . map swap . toAList . head) ) , ( String "zip", Function zip_ ) ] loadLibrary "string" = AList [ ( String "join", toVariant join ) , ( String "split", toVariant split ) ] loadLibrary "std" = V.merge (loadLibrary "list") (loadLibrary "string") loadLibrary "fp" = AList [ ( String "map", Function map_ ) ] loadLibrary other = Null