{-# LANGUAGE TypeFamilies #-}
module Data.Function.Class
( Function (..)
) where
import qualified Data.Map as Map
import qualified Data.Set as Set
class Function f where
type Domain f
type Codomain f
eval :: f -> Domain f -> Codomain f
instance Function (a -> b) where
type Domain (a -> b) = a
type Codomain (a -> b) = b
eval :: (a -> b) -> Domain (a -> b) -> Codomain (a -> b)
eval = (a -> b) -> a -> b
(a -> b) -> Domain (a -> b) -> Codomain (a -> b)
forall a. a -> a
id
instance Ord k => Function (Map.Map k v) where
type instance Domain (Map.Map k v) = k
type instance Codomain (Map.Map k v) = Maybe v
eval :: Map k v -> Domain (Map k v) -> Codomain (Map k v)
eval = (k -> Map k v -> Maybe v) -> Map k v -> k -> Maybe v
forall a b c. (a -> b -> c) -> b -> a -> c
flip k -> Map k v -> Maybe v
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup
instance Ord v => Function (Set.Set v) where
type Domain (Set.Set v) = v
type Codomain (Set.Set v) = Bool
eval :: Set v -> Domain (Set v) -> Codomain (Set v)
eval = (v -> Set v -> Bool) -> Set v -> v -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip v -> Set v -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member