{-# language DeriveDataTypeable #-}

module Satchmo.SMT.Exotic.Semiring.Arctic where

import Satchmo.SMT.Exotic.Semiring.Class

import Data.Typeable

data Arctic a = Minus_Infinite | Finite a deriving (Eq, Ord, Typeable)

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

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

instance (Ord a, Num a) => Semiring (Arctic a) where
    strictness _ = Half
    nonnegative a = True -- ??
    strictly_positive a = case a of Finite x -> x >= 0 ; _ -> False
    ge = (>=)
    gt x y = y == Minus_Infinite || (x > y)
    plus = max
    zero = Minus_Infinite
    times x y = case (x,y) of
        (Finite a, Finite b) -> Finite (a+b)
        _ -> Minus_Infinite
    one = Finite 0