module Hydra.Dsl.Lib.Strings where

import Hydra.Dsl.Base
import Hydra.Phantoms
import Hydra.Sources.Libraries
import qualified Hydra.Dsl.Terms as Terms


(++) :: Datum String -> Datum String -> Datum String
Datum String
l ++ :: Datum String -> Datum String -> Datum String
++ Datum String
r = (Term -> Datum ([String] -> String)
forall a. Term -> Datum a
Datum (Term -> Datum ([String] -> String))
-> Term -> Datum ([String] -> String)
forall a b. (a -> b) -> a -> b
$ Name -> Term
Terms.primitive Name
_strings_cat) Datum ([String] -> String) -> Datum [String] -> Datum String
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ ([Datum String] -> Datum [String]
forall a. [Datum a] -> Datum [a]
list [Datum String
l, Datum String
r])

cat :: Datum ([String] -> String)
cat :: Datum ([String] -> String)
cat = Term -> Datum ([String] -> String)
forall a. Term -> Datum a
Datum (Term -> Datum ([String] -> String))
-> Term -> Datum ([String] -> String)
forall a b. (a -> b) -> a -> b
$ Name -> Term
Terms.primitive Name
_strings_cat

cat2 :: Datum (String -> String -> String)
cat2 :: Datum (String -> String -> String)
cat2 = Term -> Datum (String -> String -> String)
forall a. Term -> Datum a
Datum (Term -> Datum (String -> String -> String))
-> Term -> Datum (String -> String -> String)
forall a b. (a -> b) -> a -> b
$ Name -> Term
Terms.primitive Name
_strings_cat2

fromList :: Datum ([Int] -> String)
fromList :: Datum ([Int] -> String)
fromList = Term -> Datum ([Int] -> String)
forall a. Term -> Datum a
Datum (Term -> Datum ([Int] -> String))
-> Term -> Datum ([Int] -> String)
forall a b. (a -> b) -> a -> b
$ Name -> Term
Terms.primitive Name
_strings_fromList

intercalate :: Datum (String -> [String] -> String)
intercalate :: Datum (String -> [String] -> String)
intercalate = Term -> Datum (String -> [String] -> String)
forall a. Term -> Datum a
Datum (Term -> Datum (String -> [String] -> String))
-> Term -> Datum (String -> [String] -> String)
forall a b. (a -> b) -> a -> b
$ Name -> Term
Terms.primitive Name
_strings_intercalate

isEmpty :: Datum (String -> Bool)
isEmpty :: Datum (String -> Bool)
isEmpty = Term -> Datum (String -> Bool)
forall a. Term -> Datum a
Datum (Term -> Datum (String -> Bool)) -> Term -> Datum (String -> Bool)
forall a b. (a -> b) -> a -> b
$ Name -> Term
Terms.primitive Name
_strings_isEmpty

length :: Datum (String -> Int)
length :: Datum (String -> Int)
length = Term -> Datum (String -> Int)
forall a. Term -> Datum a
Datum (Term -> Datum (String -> Int)) -> Term -> Datum (String -> Int)
forall a b. (a -> b) -> a -> b
$ Name -> Term
Terms.primitive Name
_strings_length

splitOn :: Datum (String -> String -> [String])
splitOn :: Datum (String -> String -> [String])
splitOn = Term -> Datum (String -> String -> [String])
forall a. Term -> Datum a
Datum (Term -> Datum (String -> String -> [String]))
-> Term -> Datum (String -> String -> [String])
forall a b. (a -> b) -> a -> b
$ Name -> Term
Terms.primitive Name
_strings_splitOn

toList :: Datum (String -> [Int])
toList :: Datum (String -> [Int])
toList = Term -> Datum (String -> [Int])
forall a. Term -> Datum a
Datum (Term -> Datum (String -> [Int]))
-> Term -> Datum (String -> [Int])
forall a b. (a -> b) -> a -> b
$ Name -> Term
Terms.primitive Name
_strings_toList

toLower :: Datum (String -> String)
toLower :: Datum (String -> String)
toLower = Term -> Datum (String -> String)
forall a. Term -> Datum a
Datum (Term -> Datum (String -> String))
-> Term -> Datum (String -> String)
forall a b. (a -> b) -> a -> b
$ Name -> Term
Terms.primitive Name
_strings_toLower

toUpper :: Datum (String -> String)
toUpper :: Datum (String -> String)
toUpper = Term -> Datum (String -> String)
forall a. Term -> Datum a
Datum (Term -> Datum (String -> String))
-> Term -> Datum (String -> String)
forall a b. (a -> b) -> a -> b
$ Name -> Term
Terms.primitive Name
_strings_toUpper

-- Helpers

concat :: [Datum String] -> Datum String
concat :: [Datum String] -> Datum String
concat [Datum String]
strings = (Term -> Datum ([String] -> String)
forall a. Term -> Datum a
Datum (Term -> Datum ([String] -> String))
-> Term -> Datum ([String] -> String)
forall a b. (a -> b) -> a -> b
$ Name -> Term
Terms.primitive Name
_strings_cat) Datum ([String] -> String) -> Datum [String] -> Datum String
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ [Datum String] -> Datum [String]
forall a. [Datum a] -> Datum [a]
list [Datum String]
strings