hpaco-lib-0.16.1.0: Text/HPaco/Writers/Run/Library.hs
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