{-# OPTIONS -fallow-overlapping-instances -fglasgow-exts -fallow-undecidable-instances #-}
module Autolib.Util.Size where
import Autolib.Set
import Autolib.FiniteMap
class Size a where
size :: a -> Int
instance Size (Set a) where
size :: Set a -> Int
size = Set a -> Int
forall a. Set a -> Int
cardinality
instance Size (FiniteMap a b) where
size :: FiniteMap a b -> Int
size = FiniteMap a b -> Int
forall a b. FiniteMap a b -> Int
sizeFM
instance Size a => Size [a] where
size :: [a] -> Int
size = [Int] -> Int
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([Int] -> Int) -> ([a] -> [Int]) -> [a] -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Int) -> [a] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map a -> Int
forall a. Size a => a -> Int
size
instance Size () where
size :: () -> Int
size () = Int
1
instance ( Size a, Size b ) => Size (a, b) where
size :: (a, b) -> Int
size (a
x, b
y) = a -> Int
forall a. Size a => a -> Int
size a
x Int -> Int -> Int
forall a. Num a => a -> a -> a
+ b -> Int
forall a. Size a => a -> Int
size b
y
split :: Size a
=> Int
-> [a]
-> ( [a], [a] )
split :: forall a. Size a => Int -> [a] -> ([a], [a])
split Int
lim [a]
xs | Int
lim Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| [a] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
xs = ( [], [a]
xs )
split Int
lim (a
x : [a]
xs) =
let ( [a]
ys, [a]
zs ) = Int -> [a] -> ([a], [a])
forall a. Size a => Int -> [a] -> ([a], [a])
split ( Int
lim Int -> Int -> Int
forall a. Num a => a -> a -> a
- a -> Int
forall a. Size a => a -> Int
size a
x ) [a]
xs
in ( a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
ys, [a]
zs )
instance Size Char where size :: Char -> Int
size = Int -> Char -> Int
forall a b. a -> b -> a
const Int
1
instance Size Int where size :: Int -> Int
size = Int -> Int -> Int
forall a b. a -> b -> a
const Int
1