~/bend-docscommunity

math_sequence.bend source

math_sequence.bend on the hub · documented module

# Element- and length-indexed sequence model. Random get is O(index);# runtime dense storage is Array<Element>, not this sequential observation.import Baselaw Values:  for -Element: Data  for length: Nat  Datatype Elements<-Element: Data,-length: Nat> is Data:  Elements{head: Element,tail: Values(Element,length)}def Values(Element,length):  match length:    case 0n: Unit    case 1n+rest: Elements<Element,rest>law Index:  for length: Nat  Datatype Position<-length: Nat> is Data:  First{}  Next{index: Index(length)}def Index(length):  match length:    case 0n: Empty    case 1n+rest: Position<rest>def index_value(length: Nat,index: Index(length)) -> Nat:  match length:    case 0n:      match index:    case 1n+rest:      match index:        case First{}: 0n        case Next{index}: 1n+index_value(rest,index)def tabulate(~Element: Data,~Context: Data,~sample: Context -> Nat -> Element,length: Nat,+offset: Nat,+context: Context) -> Values(Element,length):  match length:    case 0n: Unit{}    case 1n+rest:      Elements{sample(context,offset),tabulate(~Element,~Context,~sample,rest,1n+offset,context)}def get(-Element: Data,length: Nat,index: Index(length),vector: Values(Element,length)) -> Element:  match length:    case 0n:      match index:    case 1n+rest:      match index:        case First{}:          Elements{head,tail} = vector          head        case Next{index}:          Elements{head,tail} = vector          get(Element,rest,index,tail)def replicate(-Element: Data,length: Nat,+value: Element) -> Values(Element,length):  match length:    case 0n: Unit{}    case 1n+rest: Elements{value,replicate(Element,rest,value)}def zip_map(~Element: Data,~Context: Data,~combine: Context -> Element -> Element -> Element,  length: Nat,+context: Context,left: Values(Element,length),right: Values(Element,length)) -> Values(Element,length):  match length:    case 0n: Unit{}    case 1n+rest:      Elements{left_head,left_tail} = left      Elements{right_head,right_tail} = right      Elements{combine(context,left_head,right_head),zip_map(~Element,~Context,~combine,rest,context,left_tail,right_tail)}