--# -path=.:../abstract:../../prelude

concrete NumeralsFin of Numerals = open TypesFin, MorphoFin, ParadigmsFin in {

lincat 
  Numeral, Sub1000000 = {s : NForm => Str ; n : Number} ;
  Digit = {s : NForm => Str} ;
  Sub10, Sub100, Sub1000 = {s : NumPlace => NForm => Str ; n : Number} ;

lin 
  num x = x ;
  n2 = nhn (mkSubst "a" "kaksi" "kahde" "kahte" "kahta" "kahteen" "kaksi" "kaksi"
    "kaksien" "kaksia" "kaksiin") ;
  n3 = nhn (mkSubst "a" "kolme" "kolme" "kolme" "kolmea" "kolmeen" "kolmi" "kolmi"
    "kolmien" "kolmia" "kolmiin") ;
  n4 = regN "neljä" ;
  n5 = reg3N "viisi" "viiden" "viisiä" ;
  n6 = reg3N "kuusi" "kuuden" "kuusia" ; 
  n7 = nhn (mkSubst "ä" "seitsemän" "seitsemä" "seitsemä" "seitsemää" 
    "seitsemään" "seitsemi" "seitsemi" "seitsemien" "seitsemiä"
    "seitsemiin") ;
  n8 = nhn (mkSubst "a" "kahdeksan" "kahdeksa" "kahdeksa" "kahdeksaa" 
    "kahdeksaan" "kahdeksi" "kahdeksi" "kahdeksien" "kahdeksia"
    "kahdeksiin") ;
  n9 = nhn (mkSubst "ä" "yhdeksän" "yhdeksä" "yhdeksä" "yhdeksää" 
    "yhdeksään" "yhdeksi" "yhdeksi" "yhdeksien" "yhdeksiä" "yhdeksiin") ;

  pot01 = 
   {s = table {
      NumAttr => \\_ => [] ; 
      NumIndep => yksiN.s
      } ;
    n = Sg
    } ;
  pot0 d = {n = Pl ; s = \\_ => d.s} ;
  pot110 =
   {s = \\_ => kymmenenN.s ;
    n = Pl
    } ;

  pot111 = {n = Pl ; s = \\_,c => yksiN.s ! c ++"toista"} ;
  pot1to19 d = {n = Pl ; s = \\_,c => d.s ! c ++"toista"} ;
  pot0as1 n = n ;

  pot1 d = {n = Pl ; s = \\_,c => d.s ! c ++ kymmentaN.s ! c} ;
  pot1plus d e = {
    n = Pl ; 
    s = \\_,c => d.s ! c ++ kymmentaN.s ! c ++ e.s ! NumIndep ! c
    } ;
  pot1as2 n = n ;
  pot2 d = {n = Pl ; s = \\_,c => d.s ! NumAttr ! c ++ sataaN.s ! d.n ! c} ; ----
  pot2plus d e = {
    n = Pl ; 
    s = \\_,c => d.s ! NumAttr ! c ++ sataaN.s ! d.n ! c ++ e.s ! NumIndep ! c
    } ;
  pot2as3 n = {n = n.n  ; s = n.s ! NumIndep} ;
  pot3 d = {n = Pl ; s = \\c => d.s ! NumAttr ! c ++ tuhattaN.s ! d.n ! c} ; ----
  pot3plus d e = {
    n = Pl ;
    s = \\c => d.s ! NumAttr ! c ++ tuhattaN.s ! d.n ! c ++ e.s ! NumIndep ! c
    } ;
}
