0 | module Algebra.Semiring
9 | interface Semiring a where
17 | erased : Semiring a => a
18 | erased = plusNeutral
22 | linear : Semiring a => a
23 | linear = timesNeutral
27 | elimSemi : (Semiring a, Eq a) => (zero : b) -> (one : b) -> (a -> b) -> a -> b
28 | elimSemi zero one other r {a} =
29 | if r == Semiring.plusNeutral {a}
31 | else if r == Semiring.timesNeutral {a}
36 | isErased : (Semiring a, Eq a) => a -> Bool
37 | isErased = elimSemi True False (const False)
40 | isLinear : (Semiring a, Eq a) => a -> Bool
41 | isLinear = elimSemi False True (const False)
44 | isRigOther : (Semiring a, Eq a) => a -> Bool
45 | isRigOther = elimSemi False False (const True)
48 | branchZero : (Semiring a, Eq a) => Lazy b -> Lazy b -> a -> b
49 | branchZero yes no rig = if isErased rig then yes else no
52 | branchOne : (Semiring a, Eq a) => Lazy b -> Lazy b -> a -> b
53 | branchOne yes no rig = if isLinear rig then yes else no
56 | branchVal : (Semiring a, Eq a) => Lazy b -> Lazy b -> a -> b
57 | branchVal yes no rig = if isRigOther rig then yes else no