module Control.Monad.Sharing.Classes (
Sharing(..), Shareable(..), Convertible(..), Nondet(..),
MInt, MChar, MBool
) where
import Control.Monad ( MonadPlus )
import qualified Data.Set as Set
import qualified Data.Map as Map
class MonadPlus s => Sharing s
where
share :: Shareable s a => s a -> s (s a)
class Shareable m a
where
shareArgs :: Monad n =>
(forall b . Shareable m b => m b -> n (m b)) -> a -> n a
type MInt m = Int
type MChar m = Char
type MBool m = Bool
instance Monad m => Shareable m Bool
where
shareArgs _ = return
instance Monad m => Shareable m Int
where
shareArgs _ = return
instance Monad m => Shareable m Integer
where
shareArgs _ = return
instance Monad m => Shareable m Float
where
shareArgs _ = return
instance Monad m => Shareable m Double
where
shareArgs _ = return
instance Monad m => Shareable m Char
where
shareArgs _ = return
instance Monad m => Shareable m [Bool]
where
shareArgs _ = return
instance Monad m => Shareable m [Int]
where
shareArgs _ = return
instance Monad m => Shareable m [Integer]
where
shareArgs _ = return
instance Monad m => Shareable m [Float]
where
shareArgs _ = return
instance Monad m => Shareable m [Double]
where
shareArgs _ = return
instance Monad m => Shareable m [Char]
where
shareArgs _ = return
instance Monad m => Shareable m (a -> b)
where
shareArgs _ = return
instance (Monad m, Shareable m a) => Shareable m [m a]
where
shareArgs f = mapM f
class Convertible m a b
where
convert :: a -> m b
instance Monad m => Convertible m Bool Bool
where
convert = return
instance Monad m => Convertible m Int Int
where
convert = return
instance Monad m => Convertible m Integer Integer
where
convert = return
instance Monad m => Convertible m Float Float
where
convert = return
instance Monad m => Convertible m Double Double
where
convert = return
instance Monad m => Convertible m Char Char
where
convert = return
instance Monad m => Convertible m [Bool] [Bool]
where
convert = return
instance Monad m => Convertible m [Int] [Int]
where
convert = return
instance Monad m => Convertible m [Integer] [Integer]
where
convert = return
instance Monad m => Convertible m [Float] [Float]
where
convert = return
instance Monad m => Convertible m [Double] [Double]
where
convert = return
instance Monad m => Convertible m [Char] [Char]
where
convert = return
instance (Monad m, Convertible m a b) => Convertible m [a] [m b]
where
convert = return . map convert
instance (Monad m, Convertible m a b) => Convertible m [m a] [b]
where
convert = mapM (>>=convert)
class Nondet n where
failure :: n
(?) :: n -> n -> n
instance Nondet Bool where
failure = False
(?) = (||)
instance Ord a => Nondet (Set.Set a) where
failure = Set.empty
(?) = Set.union
instance Ord a => Nondet (Map.Map a Rational) where
failure = Map.empty
d1 ? d2 = Map.map (/2) $ Map.unionWith (+) d1 d2