multivariant-0.1.0.1: src/Test/Multivariant/Types/Solution.hs
{-|
Module : Test.Multivariant.Types.Solution
Description : Interpreter for solution
Copyright : (c) Anton Marchenko, Mansur Ziatdinov, 2016-2017
License : BSD-3
Maintainer : gltronred@gmail.com
Stability : provisional
Portability : POSIX
This module provides interpreter for solution.
-}
{-# LANGUAGE TypeOperators #-}
module Test.Multivariant.Types.Solution where
import Test.Multivariant.Classes
import Control.Arrow
import qualified Control.Invertible.BiArrow as BA
import Data.Invertible.Bijection
import qualified Data.Invertible.Function as Inv
-- | Type for interpreter
newtype Solution a b = Solution { solutions :: [a <-> b] }
-- | Extract a list of solutions (functions that map input to output)
getSolutions = map biTo . solutions
instance Program Solution where
step f = Solution [f]
a ~> b = Solution [sb Inv.. sa | sa <- solutions a, sb <- solutions b]
a <***> b = Solution [sa *** sb | sa <- solutions a, sb <- solutions b]
a <+++> b = Solution $ solutions a ++ solutions b
instance WithInvert Solution where
invert (Solution fs) = Solution $ map BA.invert fs
instance WithCornerCases Solution where
withCornerCases p _ = p
instance WithDescription Solution where
withDescription p _ = p