summaryrefslogtreecommitdiff
path: root/zf.icl
blob: 9b56a43cd5591f878c976a3c84ab0f44e1bf3074 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
module zf

import StdEnum, StdFunc, StdList, StdTuple, StdString

:: ZFExpr a b = ZF ((String -> a) -> b) [ZFGet a]

:: ZFGet a = (<--) infixl 7 String [a]

name :: (ZFGet a) -> String
name (n <-- _) = n
names = map name

values :: (ZFGet a) -> [a]
values (_ <-- vs) = vs
valuess = map values

eval :: (ZFExpr a b) -> [b]
eval (ZF f []) = []
eval (ZF f gs) = zf (\vset.f (\n.(snd o hd o filter (\(s,_).s==n)) vset)) vsets
where
    vsets = product (zf (\(s <-- vs).zf (\v.(s,v)) vs) gs)

product :: [[a]] -> [[a]]
product [] = [[]]
product [xs:xss] = zf2 (\x xs`.[x:xs`]) xs (product xss)
where
    zf2 :: (a b -> c) [a] [b] -> [c]
    zf2 f as bs = flatten (zf (\b.zf (\a.f a b) as) bs)

zf :: (a -> b) [a] -> [b]
zf _ [] = []
zf f [x:xs] = [f x:zf f xs]

Start = eval (ZF (\v . (v "x" * (v "y"))) ["x" <-- [2..4], "y" <-- [10..11]])