X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.runtime%2Fscl%2FCollection.scl;fp=bundles%2Forg.simantics.scl.runtime%2Fscl%2FCollection.scl;h=63df233239d7d82ab00351e14d8ce80dc24cba0d;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.runtime/scl/Collection.scl b/bundles/org.simantics.scl.runtime/scl/Collection.scl new file mode 100644 index 000000000..63df23323 --- /dev/null +++ b/bundles/org.simantics.scl.runtime/scl/Collection.scl @@ -0,0 +1,86 @@ +/* +import "Prelude" +import "IterN" + +type family El a + +class Collection a where + size :: a -> Integer + isEmpty :: a -> Boolean + iter :: (El a -> dummy) -> a -> () + any :: (El a -> Boolean) -> a -> Boolean + all :: (El a -> Boolean) -> a -> Boolean + filter :: (El a -> Boolean) -> a -> a + partition :: (El a -> Boolean) -> a -> (a,a) + groupBy :: Hashable b => (El a -> b) -> [(b, a)] + uniqueElement :: a -> El a // may fail + fromList :: [El a] -> a + toList :: a -> [El a] + +@inline +for :: a -> (El a -> dummy) -> () +for c f = iter f c + +class (Collection a) => Sequence a where + // required + (!) :: a -> Integer -> El a + sub :: a -> Integer -> Integer -> a + + // optional + length :: a -> Integer + take :: Integer -> a -> a + drop :: Integer -> a -> a + + mapFirst :: (El a -> Maybe b) -> a -> Maybe b + foldl :: (b -> El a -> b) -> b -> a -> b + foldr :: (El a -> b -> b) -> b -> a -> b + foldl1 :: (El a -> El a -> El a) -> a -> a + foldr1 :: (El a -> El a -> El a) -> a -> a + + elem :: Eq (El a) => El a -> a -> Boolean + elemIndex :: Eq (El a) => El a -> a -> Maybe Integer + elemIndices :: Eq (El a) => El a -> a -> [Integer] + find :: (El a -> Boolean) -> a -> Maybe (El a) + findIndex :: (El a -> Boolean) -> a -> Maybe Integer + findIndices :: (El a -> Boolean) -> a -> [Integer] + mapS :: (El a -> El a) -> a -> a + singleton :: El a -> a + + head :: a -> El a + tail :: a -> a + safeHead :: a -> Maybe (El a) + safeTail :: a -> Maybe a + + reverse :: a -> a + + sort :: Ord (El a) => a -> a + sortBy :: Ord b => (El a -> b) -> a -> a + + mapN :: (Integer -> El a) -> Integer -> a + + mapG :: Sequence b => (El b -> El a) -> b -> a + + length l = size l + + isEmpty c = length c == 0 + take n c = sub c 0 n + drop n c = sub c n (length c) + iter f c = iterN (f . (c !)) (length c) + any f c = anyN (f . (c !)) (length c) + all f c = allN (f . (c !)) (length c) + mapFirst f c = mapFirstN (f . (c !)) (length c) + +class (forall a. Sequence f a, Functor f) => GenericSequence f where + concatMap :: (a -> f b) -> f a -> f b + map :: (a -> b) -> f a -> f b + mapMaybe :: (a -> Maybe b) -> f a -> f b + +class Set a where + union :: a -> a -> a + intersection :: a -> a -> a + +type family Key a +type family Value a + +class Map a where +*/ \ No newline at end of file