kernel_block.bend
stelliferous@0.0.2.0 · 42 lines · 6 definitions
1import Base
2
3
4type Twin<-Element: Data> is Data:
5 Twin{first: Element,second: Element}
6
7
8
9def zip_map(~Element: Data,~Context: Data,~combine: Element -> Element -> Context -> Element,
10 left: Twin<Element>,right: Twin<Element>,context: Context) -> Twin<Element>:
11 Twin{left_first,left_second} = left
12 Twin{right_first,right_second} = right
13 +context = context
14 Twin{combine(left_first,right_first,context),combine(left_second,right_second,context)}
15
16def finish_pair(~State: Type,~Element: Data,first: Element,result: State & Element) -> State & Twin<Element>:
17 (state,second) = result
18 (state,Twin{first,second})
19
20def read_second(
21 ~State: Type,~Context: Data,~Element: Data,~Index: Data,
22 ~read: State -> Context -> Index -> State & Element,
23 result: State & Element,context: Context,index: Index
24) -> State & Twin<Element>:
25 (state,first) = result
26 finish_pair(~State,~Element,first,read(state,context,index))
27
28def read_at(
29 ~State: Type,~Context: Data,~Element: Data,~Index: Data,
30 ~read: State -> Context -> Index -> State & Element,
31 state: State,+context: Context,first: Index,second: Index
32) -> State & Twin<Element>:
33 read_second(~State,~Context,~Element,~Index,~read,read(state,context,first),context,second)
34
35def read_pair(
36 ~State: Type,~Context: Data,~Element: Data,
37 ~read: State -> Context -> Nat -> State & Element,~stride: Nat,
38 state: State,context: Context,index: Nat
39) -> State & Twin<Element>:
40 +context = context
41 +index = index
42 read_at(~State,~Context,~Element,~Nat,~read,state,context,index,Nat.add(index,stride))