module Pandora.Paradigm.Primary.Functor.Predicate where

import Pandora.Core.Morphism ((!))
import Pandora.Pattern.Category ((.), ($))
import Pandora.Pattern.Functor.Contravariant (Contravariant ((>$<)))
import Pandora.Pattern.Functor.Determinable (Determinable (determine))
import Pandora.Paradigm.Primary.Object.Boolean (Boolean (True))

newtype Predicate a = Predicate (a -> Boolean)

instance Contravariant Predicate where
        f >$< Predicate g = Predicate $ g . f

instance Determinable Predicate where
        determine = Predicate (True !)