{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE Safe #-}
module Data.Function.Step.Discrete.Open (
SF (..),
constant,
step,
fromList,
normalise,
(!),
values,
toDense,
fromDense,
showSF,
putSF,
) where
import Control.Applicative (Applicative (pure, (<*>)), liftA2, (<$>))
import Control.DeepSeq (NFData (..))
import Control.Monad (ap)
import Data.Functor.Classes
import Data.List (intercalate)
import Data.Map (Map)
import Data.Maybe (mapMaybe)
import Prelude
(Eq (..), Functor (fmap), IO, Maybe (..), Monad (..), Ord (..),
Show (..), String, fst, id, length, map, min, otherwise, putStrLn,
replicate, uncurry, ($), (++), (-), (.))
import Data.Foldable (Foldable, foldr, maximum)
import Data.Monoid (Monoid (..))
import Data.Semigroup (Semigroup (..))
import Data.Traversable (Traversable)
import Text.Show (showListWith)
import qualified Data.Function.Step as SF
import qualified Data.Map as Map
import qualified Test.QuickCheck as QC
data SF k v = SF !(Map k v) !v
deriving (SF k v -> SF k v -> Bool
(SF k v -> SF k v -> Bool)
-> (SF k v -> SF k v -> Bool) -> Eq (SF k v)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall k v. (Eq k, Eq v) => SF k v -> SF k v -> Bool
$c== :: forall k v. (Eq k, Eq v) => SF k v -> SF k v -> Bool
== :: SF k v -> SF k v -> Bool
$c/= :: forall k v. (Eq k, Eq v) => SF k v -> SF k v -> Bool
/= :: SF k v -> SF k v -> Bool
Eq, Eq (SF k v)
Eq (SF k v) =>
(SF k v -> SF k v -> Ordering)
-> (SF k v -> SF k v -> Bool)
-> (SF k v -> SF k v -> Bool)
-> (SF k v -> SF k v -> Bool)
-> (SF k v -> SF k v -> Bool)
-> (SF k v -> SF k v -> SF k v)
-> (SF k v -> SF k v -> SF k v)
-> Ord (SF k v)
SF k v -> SF k v -> Bool
SF k v -> SF k v -> Ordering
SF k v -> SF k v -> SF k v
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall k v. (Ord k, Ord v) => Eq (SF k v)
forall k v. (Ord k, Ord v) => SF k v -> SF k v -> Bool
forall k v. (Ord k, Ord v) => SF k v -> SF k v -> Ordering
forall k v. (Ord k, Ord v) => SF k v -> SF k v -> SF k v
$ccompare :: forall k v. (Ord k, Ord v) => SF k v -> SF k v -> Ordering
compare :: SF k v -> SF k v -> Ordering
$c< :: forall k v. (Ord k, Ord v) => SF k v -> SF k v -> Bool
< :: SF k v -> SF k v -> Bool
$c<= :: forall k v. (Ord k, Ord v) => SF k v -> SF k v -> Bool
<= :: SF k v -> SF k v -> Bool
$c> :: forall k v. (Ord k, Ord v) => SF k v -> SF k v -> Bool
> :: SF k v -> SF k v -> Bool
$c>= :: forall k v. (Ord k, Ord v) => SF k v -> SF k v -> Bool
>= :: SF k v -> SF k v -> Bool
$cmax :: forall k v. (Ord k, Ord v) => SF k v -> SF k v -> SF k v
max :: SF k v -> SF k v -> SF k v
$cmin :: forall k v. (Ord k, Ord v) => SF k v -> SF k v -> SF k v
min :: SF k v -> SF k v -> SF k v
Ord, (forall a b. (a -> b) -> SF k a -> SF k b)
-> (forall a b. a -> SF k b -> SF k a) -> Functor (SF k)
forall a b. a -> SF k b -> SF k a
forall a b. (a -> b) -> SF k a -> SF k b
forall k a b. a -> SF k b -> SF k a
forall k a b. (a -> b) -> SF k a -> SF k b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall k a b. (a -> b) -> SF k a -> SF k b
fmap :: forall a b. (a -> b) -> SF k a -> SF k b
$c<$ :: forall k a b. a -> SF k b -> SF k a
<$ :: forall a b. a -> SF k b -> SF k a
Functor, (forall m. Monoid m => SF k m -> m)
-> (forall m a. Monoid m => (a -> m) -> SF k a -> m)
-> (forall m a. Monoid m => (a -> m) -> SF k a -> m)
-> (forall a b. (a -> b -> b) -> b -> SF k a -> b)
-> (forall a b. (a -> b -> b) -> b -> SF k a -> b)
-> (forall b a. (b -> a -> b) -> b -> SF k a -> b)
-> (forall b a. (b -> a -> b) -> b -> SF k a -> b)
-> (forall a. (a -> a -> a) -> SF k a -> a)
-> (forall a. (a -> a -> a) -> SF k a -> a)
-> (forall a. SF k a -> [a])
-> (forall a. SF k a -> Bool)
-> (forall a. SF k a -> Int)
-> (forall a. Eq a => a -> SF k a -> Bool)
-> (forall a. Ord a => SF k a -> a)
-> (forall a. Ord a => SF k a -> a)
-> (forall a. Num a => SF k a -> a)
-> (forall a. Num a => SF k a -> a)
-> Foldable (SF k)
forall a. Eq a => a -> SF k a -> Bool
forall a. Num a => SF k a -> a
forall a. Ord a => SF k a -> a
forall m. Monoid m => SF k m -> m
forall a. SF k a -> Bool
forall a. SF k a -> Int
forall a. SF k a -> [a]
forall a. (a -> a -> a) -> SF k a -> a
forall k a. Eq a => a -> SF k a -> Bool
forall k a. Num a => SF k a -> a
forall k a. Ord a => SF k a -> a
forall m a. Monoid m => (a -> m) -> SF k a -> m
forall k m. Monoid m => SF k m -> m
forall k a. SF k a -> Bool
forall k a. SF k a -> Int
forall k a. SF k a -> [a]
forall b a. (b -> a -> b) -> b -> SF k a -> b
forall a b. (a -> b -> b) -> b -> SF k a -> b
forall k a. (a -> a -> a) -> SF k a -> a
forall k m a. Monoid m => (a -> m) -> SF k a -> m
forall k b a. (b -> a -> b) -> b -> SF k a -> b
forall k a b. (a -> b -> b) -> b -> SF k a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
$cfold :: forall k m. Monoid m => SF k m -> m
fold :: forall m. Monoid m => SF k m -> m
$cfoldMap :: forall k m a. Monoid m => (a -> m) -> SF k a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> SF k a -> m
$cfoldMap' :: forall k m a. Monoid m => (a -> m) -> SF k a -> m
foldMap' :: forall m a. Monoid m => (a -> m) -> SF k a -> m
$cfoldr :: forall k a b. (a -> b -> b) -> b -> SF k a -> b
foldr :: forall a b. (a -> b -> b) -> b -> SF k a -> b
$cfoldr' :: forall k a b. (a -> b -> b) -> b -> SF k a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> SF k a -> b
$cfoldl :: forall k b a. (b -> a -> b) -> b -> SF k a -> b
foldl :: forall b a. (b -> a -> b) -> b -> SF k a -> b
$cfoldl' :: forall k b a. (b -> a -> b) -> b -> SF k a -> b
foldl' :: forall b a. (b -> a -> b) -> b -> SF k a -> b
$cfoldr1 :: forall k a. (a -> a -> a) -> SF k a -> a
foldr1 :: forall a. (a -> a -> a) -> SF k a -> a
$cfoldl1 :: forall k a. (a -> a -> a) -> SF k a -> a
foldl1 :: forall a. (a -> a -> a) -> SF k a -> a
$ctoList :: forall k a. SF k a -> [a]
toList :: forall a. SF k a -> [a]
$cnull :: forall k a. SF k a -> Bool
null :: forall a. SF k a -> Bool
$clength :: forall k a. SF k a -> Int
length :: forall a. SF k a -> Int
$celem :: forall k a. Eq a => a -> SF k a -> Bool
elem :: forall a. Eq a => a -> SF k a -> Bool
$cmaximum :: forall k a. Ord a => SF k a -> a
maximum :: forall a. Ord a => SF k a -> a
$cminimum :: forall k a. Ord a => SF k a -> a
minimum :: forall a. Ord a => SF k a -> a
$csum :: forall k a. Num a => SF k a -> a
sum :: forall a. Num a => SF k a -> a
$cproduct :: forall k a. Num a => SF k a -> a
product :: forall a. Num a => SF k a -> a
Foldable, Functor (SF k)
Foldable (SF k)
(Functor (SF k), Foldable (SF k)) =>
(forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> SF k a -> f (SF k b))
-> (forall (f :: * -> *) a.
Applicative f =>
SF k (f a) -> f (SF k a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> SF k a -> m (SF k b))
-> (forall (m :: * -> *) a. Monad m => SF k (m a) -> m (SF k a))
-> Traversable (SF k)
forall k. Functor (SF k)
forall k. Foldable (SF k)
forall k (m :: * -> *) a. Monad m => SF k (m a) -> m (SF k a)
forall k (f :: * -> *) a. Applicative f => SF k (f a) -> f (SF k a)
forall k (m :: * -> *) a b.
Monad m =>
(a -> m b) -> SF k a -> m (SF k b)
forall k (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> SF k a -> f (SF k b)
forall (t :: * -> *).
(Functor t, Foldable t) =>
(forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a. Monad m => SF k (m a) -> m (SF k a)
forall (f :: * -> *) a. Applicative f => SF k (f a) -> f (SF k a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> SF k a -> m (SF k b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> SF k a -> f (SF k b)
$ctraverse :: forall k (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> SF k a -> f (SF k b)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> SF k a -> f (SF k b)
$csequenceA :: forall k (f :: * -> *) a. Applicative f => SF k (f a) -> f (SF k a)
sequenceA :: forall (f :: * -> *) a. Applicative f => SF k (f a) -> f (SF k a)
$cmapM :: forall k (m :: * -> *) a b.
Monad m =>
(a -> m b) -> SF k a -> m (SF k b)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> SF k a -> m (SF k b)
$csequence :: forall k (m :: * -> *) a. Monad m => SF k (m a) -> m (SF k a)
sequence :: forall (m :: * -> *) a. Monad m => SF k (m a) -> m (SF k a)
Traversable)
instance Ord k => Applicative (SF k) where
pure :: forall a. a -> SF k a
pure = a -> SF k a
forall a k. a -> SF k a
constant
<*> :: forall a b. SF k (a -> b) -> SF k a -> SF k b
(<*>) = SF k (a -> b) -> SF k a -> SF k b
forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b
ap
instance Ord k => Monad (SF k) where
return :: forall a. a -> SF k a
return = a -> SF k a
forall a. a -> SF k a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
SF Map k a
m a
def0 >>= :: forall a b. SF k a -> (a -> SF k b) -> SF k b
>>= a -> SF k b
f = Map k b -> b -> SF k b
forall k v. Map k v -> v -> SF k v
SF
([(k, b)] -> Map k b
forall k a. [(k, a)] -> Map k a
Map.fromDistinctAscList ([(k, b)] -> Map k b) -> [(k, b)] -> Map k b
forall a b. (a -> b) -> a -> b
$ [(k, b)] -> [(k, b)]
forall k b. Ord k => [(k, b)] -> [(k, b)]
mkDistinctAscList ([(k, b)] -> [(k, b)]) -> [(k, b)] -> [(k, b)]
forall a b. (a -> b) -> a -> b
$ [(k, b)]
pieces [(k, b)] -> [(k, b)] -> [(k, b)]
forall a. [a] -> [a] -> [a]
++ [(k, b)]
pieces1)
b
def1
where
pieces :: [(k, b)]
pieces =
[ (k -> k -> k
forall a. Ord a => a -> a -> a
min k
k k
k', b
v')
| (k
k, a
v) <- Map k a -> [(k, a)]
forall k a. Map k a -> [(k, a)]
Map.toList Map k a
m
, let SF Map k b
m' b
def = a -> SF k b
f a
v
, (k
k', b
v') <- Map k b -> [(k, b)]
forall k a. Map k a -> [(k, a)]
Map.toList Map k b
m' [(k, b)] -> [(k, b)] -> [(k, b)]
forall a. [a] -> [a] -> [a]
++ [(k
k, b
def)]
]
([(k, b)]
pieces1, b
def1) = let SF Map k b
m' b
def = a -> SF k b
f a
def0 in (Map k b -> [(k, b)]
forall k a. Map k a -> [(k, a)]
Map.toList Map k b
m', b
def)
instance (Ord k, Semigroup v) => Semigroup (SF k v) where
<> :: SF k v -> SF k v -> SF k v
(<>) = (v -> v -> v) -> SF k v -> SF k v -> SF k v
forall a b c. (a -> b -> c) -> SF k a -> SF k b -> SF k c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 v -> v -> v
forall a. Semigroup a => a -> a -> a
(<>)
instance (Ord k, Monoid v) => Monoid (SF k v) where
mempty :: SF k v
mempty = v -> SF k v
forall a. a -> SF k a
forall (f :: * -> *) a. Applicative f => a -> f a
pure v
forall a. Monoid a => a
mempty
mappend :: SF k v -> SF k v -> SF k v
mappend = (v -> v -> v) -> SF k v -> SF k v -> SF k v
forall a b c. (a -> b -> c) -> SF k a -> SF k b -> SF k c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 v -> v -> v
forall a. Monoid a => a -> a -> a
mappend
instance (Ord k, QC.Arbitrary k, QC.Arbitrary v) => QC.Arbitrary (SF k v) where
arbitrary :: Gen (SF k v)
arbitrary = [(k, v)] -> v -> SF k v
forall k v. Ord k => [(k, v)] -> v -> SF k v
fromList ([(k, v)] -> v -> SF k v) -> Gen [(k, v)] -> Gen (v -> SF k v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen [(k, v)]
forall a. Arbitrary a => Gen a
QC.arbitrary Gen (v -> SF k v) -> Gen v -> Gen (SF k v)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen v
forall a. Arbitrary a => Gen a
QC.arbitrary
shrink :: SF k v -> [SF k v]
shrink (SF Map k v
m v
v) = ([(k, v)] -> v -> SF k v) -> ([(k, v)], v) -> SF k v
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry [(k, v)] -> v -> SF k v
forall k v. Ord k => [(k, v)] -> v -> SF k v
fromList (([(k, v)], v) -> SF k v) -> [([(k, v)], v)] -> [SF k v]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ([(k, v)], v) -> [([(k, v)], v)]
forall a. Arbitrary a => a -> [a]
QC.shrink (Map k v -> [(k, v)]
forall k a. Map k a -> [(k, a)]
Map.toList Map k v
m, v
v)
instance (NFData k, NFData v) => NFData (SF k v) where
rnf :: SF k v -> ()
rnf (SF Map k v
m v
v) = (Map k v, v) -> ()
forall a. NFData a => a -> ()
rnf (Map k v
m, v
v)
instance Show2 SF where
liftShowsPrec2 :: forall a b.
(Int -> a -> ShowS)
-> ([a] -> ShowS)
-> (Int -> b -> ShowS)
-> ([b] -> ShowS)
-> Int
-> SF a b
-> ShowS
liftShowsPrec2 Int -> a -> ShowS
spk [a] -> ShowS
slk Int -> b -> ShowS
spv [b] -> ShowS
slv Int
d (SF Map a b
m b
v) = (Int -> [(a, b)] -> ShowS)
-> (Int -> b -> ShowS) -> String -> Int -> [(a, b)] -> b -> ShowS
forall a b.
(Int -> a -> ShowS)
-> (Int -> b -> ShowS) -> String -> Int -> a -> b -> ShowS
showsBinaryWith
(\Int
_ -> ((a, b) -> ShowS) -> [(a, b)] -> ShowS
forall a. (a -> ShowS) -> [a] -> ShowS
showListWith (((a, b) -> ShowS) -> [(a, b)] -> ShowS)
-> ((a, b) -> ShowS) -> [(a, b)] -> ShowS
forall a b. (a -> b) -> a -> b
$ (Int -> a -> ShowS)
-> ([a] -> ShowS)
-> (Int -> b -> ShowS)
-> ([b] -> ShowS)
-> Int
-> (a, b)
-> ShowS
forall a b.
(Int -> a -> ShowS)
-> ([a] -> ShowS)
-> (Int -> b -> ShowS)
-> ([b] -> ShowS)
-> Int
-> (a, b)
-> ShowS
forall (f :: * -> * -> *) a b.
Show2 f =>
(Int -> a -> ShowS)
-> ([a] -> ShowS)
-> (Int -> b -> ShowS)
-> ([b] -> ShowS)
-> Int
-> f a b
-> ShowS
liftShowsPrec2 Int -> a -> ShowS
spk [a] -> ShowS
slk Int -> b -> ShowS
spv [b] -> ShowS
slv Int
0)
Int -> b -> ShowS
spv
String
"fromList" Int
d (Map a b -> [(a, b)]
forall k a. Map k a -> [(k, a)]
Map.toList Map a b
m) b
v
instance Show k => Show1 (SF k) where
liftShowsPrec :: forall a.
(Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> SF k a -> ShowS
liftShowsPrec = (Int -> k -> ShowS)
-> ([k] -> ShowS)
-> (Int -> a -> ShowS)
-> ([a] -> ShowS)
-> Int
-> SF k a
-> ShowS
forall a b.
(Int -> a -> ShowS)
-> ([a] -> ShowS)
-> (Int -> b -> ShowS)
-> ([b] -> ShowS)
-> Int
-> SF a b
-> ShowS
forall (f :: * -> * -> *) a b.
Show2 f =>
(Int -> a -> ShowS)
-> ([a] -> ShowS)
-> (Int -> b -> ShowS)
-> ([b] -> ShowS)
-> Int
-> f a b
-> ShowS
liftShowsPrec2 Int -> k -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec [k] -> ShowS
forall a. Show a => [a] -> ShowS
showList
instance (Show k, Show v) => Show (SF k v) where
showsPrec :: Int -> SF k v -> ShowS
showsPrec = Int -> SF k v -> ShowS
forall (f :: * -> * -> *) a b.
(Show2 f, Show a, Show b) =>
Int -> f a b -> ShowS
showsPrec2
mkDistinctAscList :: Ord k => [(k, b)] -> [(k, b)]
mkDistinctAscList :: forall k b. Ord k => [(k, b)] -> [(k, b)]
mkDistinctAscList [] = []
mkDistinctAscList ((k
k, b
v) : [(k, b)]
kv) = (k
k, b
v) (k, b) -> [(k, b)] -> [(k, b)]
forall a. a -> [a] -> [a]
: k -> [(k, b)] -> [(k, b)]
forall k b. Ord k => k -> [(k, b)] -> [(k, b)]
mkDistinctAscList' k
k [(k, b)]
kv
mkDistinctAscList' :: Ord k => k -> [(k, b)] -> [(k, b)]
mkDistinctAscList' :: forall k b. Ord k => k -> [(k, b)] -> [(k, b)]
mkDistinctAscList' k
_ [] = []
mkDistinctAscList' k
k (p :: (k, b)
p@(k
k', b
_) : [(k, b)]
kv)
| k
k k -> k -> Bool
forall a. Ord a => a -> a -> Bool
< k
k' = (k, b)
p (k, b) -> [(k, b)] -> [(k, b)]
forall a. a -> [a] -> [a]
: k -> [(k, b)] -> [(k, b)]
forall k b. Ord k => k -> [(k, b)] -> [(k, b)]
mkDistinctAscList' k
k' [(k, b)]
kv
| Bool
otherwise = k -> [(k, b)] -> [(k, b)]
forall k b. Ord k => k -> [(k, b)] -> [(k, b)]
mkDistinctAscList' k
k [(k, b)]
kv
infixl 9 !
(!) :: Ord k => SF k v -> k -> v
SF Map k v
m v
def ! :: forall k v. Ord k => SF k v -> k -> v
! k
x = case k -> Map k v -> Maybe (k, v)
forall k v. Ord k => k -> Map k v -> Maybe (k, v)
Map.lookupGT k
x Map k v
m of
Maybe (k, v)
Nothing -> v
def
Just (k
_, v
v) -> v
v
constant :: a -> SF k a
constant :: forall a k. a -> SF k a
constant = Map k a -> a -> SF k a
forall k v. Map k v -> v -> SF k v
SF Map k a
forall k a. Map k a
Map.empty
step :: k -> v -> v -> SF k v
step :: forall k v. k -> v -> v -> SF k v
step k
k = Map k v -> v -> SF k v
forall k v. Map k v -> v -> SF k v
SF (Map k v -> v -> SF k v) -> (v -> Map k v) -> v -> v -> SF k v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. k -> v -> Map k v
forall k a. k -> a -> Map k a
Map.singleton k
k
fromList :: Ord k => [(k, v)] -> v -> SF k v
fromList :: forall k v. Ord k => [(k, v)] -> v -> SF k v
fromList = Map k v -> v -> SF k v
forall k v. Map k v -> v -> SF k v
SF (Map k v -> v -> SF k v)
-> ([(k, v)] -> Map k v) -> [(k, v)] -> v -> SF k v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(k, v)] -> Map k v
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
values :: SF k v -> [v]
values :: forall k a. SF k a -> [a]
values (SF Map k v
m v
v) = Map k v -> [v]
forall k a. Map k a -> [a]
Map.elems Map k v
m [v] -> [v] -> [v]
forall a. [a] -> [a] -> [a]
++ [v
v]
normalise :: Eq v => SF k v -> SF k v
normalise :: forall v k. Eq v => SF k v -> SF k v
normalise (SF Map k v
m v
v) = ([(k, v)] -> v -> SF k v) -> ([(k, v)], v) -> SF k v
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry [(k, v)] -> v -> SF k v
forall {k} {p}. [(k, v)] -> p -> SF k v
mk (([(k, v)], v) -> SF k v) -> ([(k, v)], v) -> SF k v
forall a b. (a -> b) -> a -> b
$ ((k, v) -> ([(k, v)], v) -> ([(k, v)], v))
-> ([(k, v)], v) -> [(k, v)] -> ([(k, v)], v)
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (k, v) -> ([(k, v)], v) -> ([(k, v)], v)
forall {a} {a}. Eq a => (a, a) -> ([(a, a)], a) -> ([(a, a)], a)
go ([], v
v) (Map k v -> [(k, v)]
forall k a. Map k a -> [(k, a)]
Map.toList Map k v
m) where
mk :: [(k, v)] -> p -> SF k v
mk [(k, v)]
m' p
_ = Map k v -> v -> SF k v
forall k v. Map k v -> v -> SF k v
SF ([(k, v)] -> Map k v
forall k a. [(k, a)] -> Map k a
Map.fromDistinctAscList [(k, v)]
m') v
v
go :: (a, a) -> ([(a, a)], a) -> ([(a, a)], a)
go p :: (a, a)
p@(a
_, a
v') p' :: ([(a, a)], a)
p'@([(a, a)]
m', a
x)
| a
v' a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
x = ([(a, a)], a)
p'
| Bool
otherwise = ((a, a)
p (a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
: [(a, a)]
m', a
v')
toDense :: SF a b -> SF.SF a b
toDense :: forall a b. SF a b -> SF a b
toDense (SF Map a b
m b
v) = Map (Bound a) b -> b -> SF a b
forall k v. Map (Bound k) v -> v -> SF k v
SF.SF ((a -> Bound a) -> Map a b -> Map (Bound a) b
forall k1 k2 a. (k1 -> k2) -> Map k1 a -> Map k2 a
Map.mapKeysMonotonic a -> Bound a
forall k. k -> Bound k
SF.Open Map a b
m) b
v
fromDense
:: Ord a
=> (a -> Maybe a)
-> SF.SF a b
-> SF a b
fromDense :: forall a b. Ord a => (a -> Maybe a) -> SF a b -> SF a b
fromDense a -> Maybe a
next (SF.SF Map (Bound a) b
m b
v) = Map a b -> b -> SF a b
forall k v. Map k v -> v -> SF k v
SF (Map (Bound a) b -> Map a b
forall {a}. Map (Bound a) a -> Map a a
mapKeys Map (Bound a) b
m) b
v where
mapKeys :: Map (Bound a) a -> Map a a
mapKeys = (a -> a -> a) -> [(a, a)] -> Map a a
forall k a. Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
Map.fromListWith (\a
_ -> a -> a
forall a. a -> a
id) ([(a, a)] -> Map a a)
-> (Map (Bound a) a -> [(a, a)]) -> Map (Bound a) a -> Map a a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Bound a, a) -> Maybe (a, a)) -> [(Bound a, a)] -> [(a, a)]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe ((Bound a -> Maybe a) -> (Bound a, a) -> Maybe (a, a)
forall (f :: * -> *) a b c.
Functor f =>
(a -> f b) -> (a, c) -> f (b, c)
_1 Bound a -> Maybe a
fk) ([(Bound a, a)] -> [(a, a)])
-> (Map (Bound a) a -> [(Bound a, a)])
-> Map (Bound a) a
-> [(a, a)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map (Bound a) a -> [(Bound a, a)]
forall k a. Map k a -> [(k, a)]
Map.toList
fk :: Bound a -> Maybe a
fk (SF.Open a
k) = a -> Maybe a
forall a. a -> Maybe a
Just a
k
fk (SF.Closed a
k) = a -> Maybe a
next a
k
_1 :: Functor f => (a -> f b) -> (a, c) -> f (b, c)
_1 :: forall (f :: * -> *) a b c.
Functor f =>
(a -> f b) -> (a, c) -> f (b, c)
_1 a -> f b
f (a
a, c
c) = (b -> (b, c)) -> f b -> f (b, c)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\b
b -> (b
b, c
c)) (a -> f b
f a
a)
showSF :: (Show a, Show b) => SF a b -> String
showSF :: forall k v. (Show k, Show v) => SF k v -> String
showSF (SF Map a b
m b
v) | Map a b -> Bool
forall k a. Map k a -> Bool
Map.null Map a b
m = String
"\\_ -> " String -> ShowS
forall a. [a] -> [a] -> [a]
++ b -> String
forall a. Show a => a -> String
show b
v
showSF (SF Map a b
m b
v) = String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
"\n" ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$
String
"\\x -> if" String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [ String
" | " String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
leftPad String
k String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" -> " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
x | (String
k, String
x) <- [(String, String)]
cases ]
where
cases :: [(String, String)]
cases = [ (String
"x < " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
5 a
k String
"", b -> String
forall a. Show a => a -> String
show b
x) | (a
k,b
x) <- Map a b -> [(a, b)]
forall k a. Map k a -> [(k, a)]
Map.toList Map a b
m ] [(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++
[ (String
"otherwise", b -> String
forall a. Show a => a -> String
show b
v) ]
len :: Int
len = [Int] -> Int
forall a. Ord a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum (((String, String) -> Int) -> [(String, String)] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (String -> Int)
-> ((String, String) -> String) -> (String, String) -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String, String) -> String
forall a b. (a, b) -> a
fst) [(String, String)]
cases)
leftPad :: ShowS
leftPad String
s = String
s String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> Char -> String
forall a. Int -> a -> [a]
replicate (Int
len Int -> Int -> Int
forall a. Num a => a -> a -> a
- String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
s) Char
' '
putSF :: (Show a, Show b) => SF a b -> IO ()
putSF :: forall a b. (Show a, Show b) => SF a b -> IO ()
putSF = String -> IO ()
putStrLn (String -> IO ()) -> (SF a b -> String) -> SF a b -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SF a b -> String
forall k v. (Show k, Show v) => SF k v -> String
showSF