module Satchmo.SMT.Exotic.Semiring.Fuzzy where

import Satchmo.SMT.Exotic.Semiring.Class

data Fuzzy a = Minus_Infinite | Finite a | Plus_Infinite deriving (Eq, Ord)

instance Functor Fuzzy where
    fmap f a = case a of
        Minus_Infinite -> Minus_Infinite
        Finite x -> Finite $ f x
        Plus_Infinite -> Plus_Infinite

instance Show a => Show ( Fuzzy a ) where 
    show a = case a of
        Minus_Infinite -> "-"
        Finite x -> show x
        Plus_Infinite -> "+"

instance (Ord a, Num a) => Semiring (Fuzzy a) where
    strictness _ = Half
    nonnegative a = case a of Plus_Infinite -> False ; _ -> True
    strictly_positive = nonnegative -- CHECK
    ge x y = x == Plus_Infinite || (x > y) || y == Minus_Infinite 
    gt x y = x == Plus_Infinite || (x > y)
    plus = min
    zero = Plus_Infinite
    times = max
    one = Minus_Infinite