packages feed

pandora-0.4.6: Pandora/Paradigm/Primary/Object/Denumerator.hs

module Pandora.Paradigm.Primary.Object.Denumerator where

import Pandora.Pattern.Object.Setoid (Setoid ((==)))
import Pandora.Pattern.Object.Chain (Chain ((<=>)))
import Pandora.Pattern.Object.Semigroup (Semigroup ((+)))
import Pandora.Pattern.Object.Ringoid (Ringoid ((*)))
import Pandora.Paradigm.Primary.Object.Boolean (Boolean (True, False))
import Pandora.Paradigm.Primary.Object.Ordering (Ordering (Less, Equal, Greater))

data Denumerator = Single | Denumerator Denumerator

instance Setoid Denumerator where
	Single == Single = True
	Denumerator n == Denumerator m = n == m
	_ == _ = False

instance Chain Denumerator where
	Single <=> Single = Equal
	Single <=> Denumerator _ = Less
	Denumerator _ <=> Single = Greater
	Denumerator n <=> Denumerator m = n <=> m

instance Semigroup Denumerator where
	Single + m = Denumerator m
	Denumerator n + m = Denumerator (n + m)

instance Ringoid Denumerator where
	Single * n = n
	Denumerator n * m = m + n * m