Play with witnesses, kind of

This commit is contained in:
Niels G. W. Serup 2024-10-06 16:11:54 +02:00
parent 347cc07c93
commit 424a688d15
No known key found for this signature in database
GPG Key ID: 38EEEBCE67324F19
1 changed files with 11 additions and 3 deletions

View File

@ -1,3 +1,4 @@
{-# LANGUAGE FunctionalDependencies #-}
module Function
( concatStrings
, concatTexts
@ -77,15 +78,22 @@ lowerString :: TokenableTo String a => a -> DepGenM (Token String)
lowerString a = runFunction LowerString =<< toToken a
class WitnessFor w t | w -> t where
emptyValue :: w -> t
data StringType = StringType
instance WitnessFor StringType String where
emptyValue StringType = ""
data ElemOf a = ElemOf a deriving (Show, Lift)
instance (Show a, Lift a, Valuable a, Eq a) => IsFunction (ElemOf a) (a, [a]) Bool where
evalFunction (ElemOf _) (y, ys) = y `elem` ys
elemOf :: (Show t, Lift t, Valuable t, Eq t, TokenableTo t a, TokenableTo [t] b) => t -> a -> b -> DepGenM (Token Bool)
elemOf witness a b = runFunction (ElemOf witness) =<< toTupleToken a b
elemOf :: (Show t, Lift t, Valuable t, Eq t, TokenableTo t a, TokenableTo [t] b, WitnessFor w t) => w -> a -> b -> DepGenM (Token Bool)
elemOf witness a b = runFunction (ElemOf (emptyValue witness)) =<< toTupleToken a b
elemOfString :: (TokenableTo String a, TokenableTo [String] b) => a -> b -> DepGenM (Token Bool)
elemOfString a b = elemOf "" a b
elemOfString = elemOf StringType
data MakeTemplate = MakeTemplate deriving (Show, Lift)