packages feed

pandora-0.3.3: Pandora/Paradigm/Primary/Object/Natural.hs

module Pandora.Paradigm.Primary.Object.Natural where

import Pandora.Pattern.Category (($))
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.Pattern.Object.Monoid (Monoid (zero))
import Pandora.Pattern.Object.Quasiring (Quasiring (one))
import Pandora.Paradigm.Primary.Object.Boolean (Boolean (True, False))
import Pandora.Paradigm.Primary.Object.Ordering (Ordering (Less, Equal, Greater))

data Natural = Zero | Natural Natural

instance Setoid Natural where
	Zero == Zero = True
	Natural n == Natural m = n == m
	_ == _ = False

instance Chain Natural where
	Zero <=> Zero = Equal
	Zero <=> Natural _ = Less
	Natural _ <=> Zero = Greater
	Natural n <=> Natural m = n <=> m

instance Semigroup Natural where
	Zero + m = m
	Natural n + m = Natural $ n + m

instance Ringoid Natural where
	Zero * _ = Zero
	Natural n * m = m + n * m

instance Monoid Natural where
	zero = Zero

instance Quasiring Natural where
	one = Natural Zero